From 5d0dea0c7bf5ed72e43f3cf0f87720ba2d8a2687 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 8 Mar 2024 00:50:37 +0000 Subject: [PATCH] Rebuild pages at b5081024f14018f371ec210b22f25d5122b6027c --- .../authorship.json | 2 +- AY2324S2-CS2103-F08-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103-F15-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-F10-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-F11-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-F11-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-F12-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-F12-4_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-F13-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T08-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T08-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T10-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T10-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T11-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T12-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T12-4_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T13-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T14-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T15-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T15-4_tp_master/commits.json | 2 +- AY2324S2-CS2103T-T16-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T17-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W09-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W09-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W10-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W10-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W13-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W13-4_tp_master/commits.json | 2 +- archive.zip | Bin 2019294 -> 2106363 bytes reposense-logs/reposense.log.0 | 2530 ++++++++--------- summary.json | 2 +- 56 files changed, 1319 insertions(+), 1319 deletions(-) diff --git a/AY2324S2-CS2103-F08-3_tp_master/authorship.json b/AY2324S2-CS2103-F08-3_tp_master/authorship.json index 0354e9f6..2bcadae3 100644 --- a/AY2324S2-CS2103-F08-3_tp_master/authorship.json +++ b/AY2324S2-CS2103-F08-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Pluiexo"},"content":"# StaffConnect","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103-F08-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"This product allows users to easily identify and connect with educators by providing visual cues alongside contact","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Pluiexo"},"content":"details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Pluiexo"},"content":"# Features:","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Pluiexo"},"content":"* Quickly add and review contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Pluiexo"},"content":"* Filter and search your required contacts quickly","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Pluiexo"},"content":"* Add consultation times to the particular contact","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Pluiexo"},"content":"* View and manage your meeting times","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Pluiexo"},"content":"# Getting Started","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Pluiexo"},"content":" * Ensure that at least **Java 11 with JavaFx runtime is installed**","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Pluiexo"},"content":" * Run the the application with ```java -jar StaffConnect.jar```","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Pluiexo"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Pluiexo"},"content":"# Credits","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Pluiexo"},"content":"StaffConnect is an ongoing software project for a desktop application used for managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Pluiexo"},"content":"* For the detailed documentation of this project, see the **[StaffConnect Product Website](https://ay2324s2-cs2103-f08-3.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Pluiexo"},"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":25,"author":{"gitId":"Pluiexo"},"content":"* 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-03-07"}],"authorContributionMap":{"Pluiexo":22,"-":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":"-"},"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":"tsulim"},"content":"### Lim Xiu Jia","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"\u003cimg src\u003d\"images/tsulim.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"[[github](https://github.com/tsulim)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/tsulim.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"* Responsibilities: Scheduling and tracking","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"whitesnowx"},"content":"### Calista Wong","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"whitesnowx"},"content":"\u003cimg src\u003d\"images/whitesnowx.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"whitesnowx"},"content":"[[github](https://github.com/whitesnowx)]","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/whitesnowx)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"whitesnowx"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"whitesnowx"},"content":"* Responsibilities: Documentation and organisation","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"iynixil"},"content":"### Li Xinyi ","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"iynixil"},"content":"\u003cimg src\u003d\"images/iynixil.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"iynixil"},"content":"[[github](http://github.com/iynixil)] [[portfolio](team/iynixil.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"iynixil"},"content":"* Responsibilities: Documentation Quality Assurance","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"JerryWang0000"},"content":"### Jerry Wang","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":"\u003cimg src\u003d\"images/jerrywang0000.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"JerryWang0000"},"content":"[[github](http://github.com/JerryWang0000)]","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/jerrywang0000)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"JerryWang0000"},"content":"* Role: Backend Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"JerryWang0000"},"content":"* Responsibilities: Development of Functionalities","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"Pluiexo"},"content":"### Norton Ng","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"Pluiexo"},"content":"\u003cimg src\u003d\"images/pluiexo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Pluiexo"},"content":"[[github](http://github.com/Pluiexo)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"Pluiexo"},"content":"[[portfolio](team/pluiexo.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Pluiexo"},"content":"* Responsibilities: Development of UI/UX and Integration, Lead","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tsulim":9,"iynixil":4,"JerryWang0000":4,"Pluiexo":5,"whitesnowx":5,"-":32}},{"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":"iynixil"},"content":"* This developer guide is adapted from [AB-3 Developer Guide](https://se-education.org/addressbook-level3/DeveloperGuide.html).","lastModifiedDate":"2024-03-06"},{"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":"iynixil"},"content":"Bob is a 22 year old NUS SOC student who often struggles with finding details about his professors\u0027 and tutors\u0027 consultation hours.","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"iynixil"},"content":"He prefers certain professors and tutors but often misplaces their contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"iynixil"},"content":"as such information can be hard to find online. He also has difficulty identifying his professors and changing tutors.","lastModifiedDate":"2024-03-06"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"iynixil"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-06"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"iynixil"},"content":"StaffConnect offers convenience and efficiency for a forgetful tech-savvy student.","lastModifiedDate":"2024-03-06"},{"lineNumber":272,"author":{"gitId":"iynixil"},"content":"StaffConnect allows users to easily identify and connect with educators by providing visual cues alongside their contact details, supported by an easy-to-use filtering system.","lastModifiedDate":"2024-03-06"},{"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":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"iynixil"},"content":"| `* * *` | sociable user | save a contact\u0027s name, email, phone number, title in one line | save time per entry |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store a professor\u0027s name | recall how to address the professor |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"iynixil"},"content":"| `* * *` | forgetful user | store a professor\u0027s faculty | see the faculty that a professor belongs to |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"iynixil"},"content":"| `* * *` | student who get lost easily | view the locations of my meetings/classes | search the locations for my meetings easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store a professor\u0027s consultation hours | arrange times to meet my professor for consultation |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their name | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their availability | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their module | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store the modules a professor is teaching | contact the professors who teach a module which I am currently taking |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their module | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"iynixil"},"content":"| `* * *` | forgetful user | filter the professors by their faculty or the course they teach | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"whitesnowx"},"content":"(For all use cases below, the **System** is the `StaffConnect` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"whitesnowx"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"whitesnowx"},"content":"2. User requests to add a new person","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"whitesnowx"},"content":"**Use case: Filter the list**","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"whitesnowx"},"content":"2. User requests to filter the list by a specific attribute","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"whitesnowx"},"content":"3. StaffConnect shows a filtered list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"whitesnowx"},"content":"**Use case: Sort the list**","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"whitesnowx"},"content":"2. User requests to sort the list by a specific attribute","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"whitesnowx"},"content":"3. StaffConnect shows a sorted list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"whitesnowx"},"content":"**Use case: Delete a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"whitesnowx"},"content":"2. User requests to delete a specific person in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"whitesnowx"},"content":"3. AddressBook deletes the person","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"whitesnowx"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"whitesnowx"},"content":" * 2a1. StaffConnect shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"whitesnowx"},"content":"**Use case: Edit a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"whitesnowx"},"content":"2. User requests to edit a specific person in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"whitesnowx"},"content":"3. AddressBook edits the person","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"whitesnowx"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"whitesnowx"},"content":" * 2a1. StaffConnect shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"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":398,"author":{"gitId":"JerryWang0000"},"content":"2. Should be able to answer a user\u0027s prompt within 1 second.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"JerryWang0000"},"content":"3. Should require less computational resources to allow users with older hardware can use the app without trouble.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"JerryWang0000"},"content":"4. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"JerryWang0000"},"content":"5. Should be able to provide error messages when a user does not type in expected prompts.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"JerryWang0000"},"content":"6. Should be able to store the users\u0027 information securely without leakage.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"JerryWang0000"},"content":"7. Should provide understandable and informative responses whenever a user provides a prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"JerryWang0000"},"content":"8. 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":405,"author":{"gitId":"JerryWang0000"},"content":"9. A user without much experience in admin commands should be able to handle the usage in rather short time.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"JerryWang0000"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS, with versions that support Java 11","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"JerryWang0000"},"content":"* **Users\u0027 Information**: Same as above","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"JerryWang0000"},"content":"* **Error Message**: A prompt printed to the user that the program execution cannot run normally and specifies the most possible cause","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"JerryWang0000"},"content":"* **MSS**: Main Success Scenario","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"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":424,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"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":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"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":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"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":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"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":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"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":458,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"iynixil":18,"JerryWang0000":12,"whitesnowx":76,"-":362}},{"path":"docs/Documentation.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: Documentation guide","lastModifiedDate":"2020-06-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"**Setting up and maintaining the project website:**","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"* We use [**Jekyll**](https://jekyllrb.com/) to manage documentation.","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"* The `docs/` folder is used for documentation.","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"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":"2020-06-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* Note these points when adapting the documentation to a different project/product:","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"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":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"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":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"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":"2021-07-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"**Style guidance:**","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Follow the [**_Google developer documentation style guide_**](https://developers.google.com/style).","lastModifiedDate":"2020-06-17"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* Also relevant is the [_[se-edu/guides] **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html)","lastModifiedDate":"2020-06-17"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"**Diagrams:**","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* See the [_[se-edu/guides] **Using PlantUML**_](https://se-education.org/guides/tutorials/plantUml.html)","lastModifiedDate":"2020-06-17"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"**Converting a document to the PDF format:**","lastModifiedDate":"2020-06-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* See the guide [_[se-edu/guides] **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html)","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"whitesnowx":2,"-":29}},{"path":"docs/team/iynixil.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"iynixil"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"iynixil"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Xin Yi\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"iynixil"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"iynixil"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"iynixil"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"iynixil"},"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-06"},{"lineNumber":14,"author":{"gitId":"iynixil"},"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-06"},{"lineNumber":15,"author":{"gitId":"iynixil"},"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-06"},{"lineNumber":16,"author":{"gitId":"iynixil"},"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-06"},{"lineNumber":17,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"iynixil"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"iynixil"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"iynixil"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"iynixil"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"iynixil"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"iynixil"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"iynixil"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"iynixil"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"iynixil"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"iynixil"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"iynixil"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"iynixil"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"iynixil"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"iynixil"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"iynixil"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"iynixil"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"iynixil"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"iynixil"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"iynixil"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"iynixil"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"iynixil"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"iynixil"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"iynixil":43,"Pluiexo":3}},{"path":"docs/team/jerrywang0000.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JerryWang0000"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"JerryWang0000"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"JerryWang0000"},"content":"title: Jerry Wang\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"JerryWang0000"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"JerryWang0000"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"JerryWang0000"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"JerryWang0000"},"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-06"},{"lineNumber":14,"author":{"gitId":"JerryWang0000"},"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-06"},{"lineNumber":15,"author":{"gitId":"JerryWang0000"},"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-06"},{"lineNumber":16,"author":{"gitId":"JerryWang0000"},"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-06"},{"lineNumber":17,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"JerryWang0000"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"JerryWang0000"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"JerryWang0000"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"JerryWang0000"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"JerryWang0000"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"JerryWang0000"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"JerryWang0000"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"JerryWang0000"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"JerryWang0000"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"JerryWang0000"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"JerryWang0000"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"JerryWang0000"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"JerryWang0000"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"JerryWang0000"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"JerryWang0000"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"JerryWang0000"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"JerryWang0000"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"JerryWang0000"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"JerryWang0000"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"JerryWang0000"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"JerryWang0000"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"JerryWang0000"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"JerryWang0000":44,"Pluiexo":2}},{"path":"docs/team/pluiexo.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":"Pluiexo"},"content":"title: Norton\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":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"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":{"Pluiexo":3,"-":43}},{"path":"docs/team/tsulim.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"tsulim"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Xiu Jia\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"tsulim"},"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-06"},{"lineNumber":14,"author":{"gitId":"tsulim"},"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-06"},{"lineNumber":15,"author":{"gitId":"tsulim"},"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-06"},{"lineNumber":16,"author":{"gitId":"tsulim"},"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-06"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"tsulim"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"tsulim"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"tsulim"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"tsulim"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"tsulim"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"tsulim"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"tsulim"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"tsulim"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"tsulim"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"tsulim"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"tsulim"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"tsulim":43,"Pluiexo":3}},{"path":"docs/team/whitesnowx.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"whitesnowx"},"content":"title: Wong\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"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":"2024-03-06"},{"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":"2024-03-06"},{"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":"2024-03-06"},{"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":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"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":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Pluiexo":2,"whitesnowx":1,"-":43}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Pluiexo"},"content":"# StaffConnect","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103-F08-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"This product allows users to easily identify and connect with educators by providing visual cues alongside contact","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Pluiexo"},"content":"details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Pluiexo"},"content":"# Features:","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Pluiexo"},"content":"* Quickly add and review contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Pluiexo"},"content":"* Filter and search your required contacts quickly","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Pluiexo"},"content":"* Add consultation times to the particular contact","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Pluiexo"},"content":"* View and manage your meeting times","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Pluiexo"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Pluiexo"},"content":"# Getting Started","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Pluiexo"},"content":" * Ensure that at least **Java 11 with JavaFx runtime is installed**","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Pluiexo"},"content":" * Run the the application with ```java -jar StaffConnect.jar```","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Pluiexo"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Pluiexo"},"content":"# Credits","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Pluiexo"},"content":"StaffConnect is an ongoing software project for a desktop application used for managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Pluiexo"},"content":"* For the detailed documentation of this project, see the **[StaffConnect Product Website](https://ay2324s2-cs2103-f08-3.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Pluiexo"},"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":25,"author":{"gitId":"Pluiexo"},"content":"* 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-03-07"}],"authorContributionMap":{"Pluiexo":22,"-":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":"-"},"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":"tsulim"},"content":"### Lim Xiu Jia","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"tsulim"},"content":"\u003cimg src\u003d\"images/tsulim.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"tsulim"},"content":"[[github](https://github.com/tsulim)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/tsulim.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"* Responsibilities: Scheduling and tracking","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"whitesnowx"},"content":"### Calista Wong","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"whitesnowx"},"content":"\u003cimg src\u003d\"images/whitesnowx.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"whitesnowx"},"content":"[[github](https://github.com/whitesnowx)]","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/whitesnowx)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"whitesnowx"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"whitesnowx"},"content":"* Responsibilities: Documentation and organisation","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"iynixil"},"content":"### Li Xinyi ","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"iynixil"},"content":"\u003cimg src\u003d\"images/iynixil.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"iynixil"},"content":"[[github](http://github.com/iynixil)] [[portfolio](team/iynixil.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"iynixil"},"content":"* Responsibilities: Documentation Quality Assurance","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"JerryWang0000"},"content":"### Jerry Wang","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":"\u003cimg src\u003d\"images/jerrywang0000.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"JerryWang0000"},"content":"[[github](http://github.com/JerryWang0000)]","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"[[portfolio](team/jerrywang0000)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"JerryWang0000"},"content":"* Role: Backend Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"JerryWang0000"},"content":"* Responsibilities: Development of Functionalities","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"Pluiexo"},"content":"### Norton Ng","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"Pluiexo"},"content":"\u003cimg src\u003d\"images/pluiexo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Pluiexo"},"content":"[[github](http://github.com/Pluiexo)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"Pluiexo"},"content":"[[portfolio](team/pluiexo.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Pluiexo"},"content":"* Responsibilities: Development of UI/UX and Integration, Lead","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tsulim":9,"iynixil":4,"JerryWang0000":4,"Pluiexo":5,"whitesnowx":5,"-":32}},{"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":"iynixil"},"content":"* This developer guide is adapted from [AB-3 Developer Guide](https://se-education.org/addressbook-level3/DeveloperGuide.html).","lastModifiedDate":"2024-03-06"},{"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":"iynixil"},"content":"Bob is a 22 year old NUS SOC student who often struggles with finding details about his professors\u0027 and tutors\u0027 consultation hours.","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"iynixil"},"content":"He prefers certain professors and tutors but often misplaces their contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"iynixil"},"content":"as such information can be hard to find online. He also has difficulty identifying his professors and changing tutors.","lastModifiedDate":"2024-03-06"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"iynixil"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-06"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"iynixil"},"content":"StaffConnect offers convenience and efficiency for a forgetful tech-savvy student.","lastModifiedDate":"2024-03-06"},{"lineNumber":272,"author":{"gitId":"iynixil"},"content":"StaffConnect allows users to easily identify and connect with educators by providing visual cues alongside their contact details, supported by an easy-to-use filtering system.","lastModifiedDate":"2024-03-06"},{"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":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"iynixil"},"content":"| `* * *` | sociable user | save a contact\u0027s name, email, phone number, title in one line | save time per entry |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store a professor\u0027s name | recall how to address the professor |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"iynixil"},"content":"| `* * *` | forgetful user | store a professor\u0027s faculty | see the faculty that a professor belongs to |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"iynixil"},"content":"| `* * *` | student who get lost easily | view the locations of my meetings/classes | search the locations for my meetings easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store a professor\u0027s consultation hours | arrange times to meet my professor for consultation |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their name | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their availability | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their module | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"iynixil"},"content":"| `* * *` | disorganised student | store the modules a professor is teaching | contact the professors who teach a module which I am currently taking |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"iynixil"},"content":"| `* * *` | slow reader | filter through contact entry by their module | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"iynixil"},"content":"| `* * *` | forgetful user | filter the professors by their faculty or the course they teach | not waste time in finding a specific contact/s and access their info easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"whitesnowx"},"content":"(For all use cases below, the **System** is the `StaffConnect` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"whitesnowx"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"whitesnowx"},"content":"2. User requests to add a new person","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"whitesnowx"},"content":"**Use case: Filter the list**","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"whitesnowx"},"content":"2. User requests to filter the list by a specific attribute","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"whitesnowx"},"content":"3. StaffConnect shows a filtered list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"whitesnowx"},"content":"**Use case: Sort the list**","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"whitesnowx"},"content":"2. User requests to sort the list by a specific attribute","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"whitesnowx"},"content":"3. StaffConnect shows a sorted list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"whitesnowx"},"content":"**Use case: Delete a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"whitesnowx"},"content":"2. User requests to delete a specific person in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"whitesnowx"},"content":"3. AddressBook deletes the person","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"whitesnowx"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"whitesnowx"},"content":" * 2a1. StaffConnect shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"whitesnowx"},"content":"**Use case: Edit a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"whitesnowx"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"whitesnowx"},"content":"1. StaffConnect shows a list of persons","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"whitesnowx"},"content":"2. User requests to edit a specific person in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"whitesnowx"},"content":"3. AddressBook edits the person","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"whitesnowx"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"whitesnowx"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"whitesnowx"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"whitesnowx"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"whitesnowx"},"content":" * 2a1. StaffConnect shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"whitesnowx"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"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":398,"author":{"gitId":"JerryWang0000"},"content":"2. Should be able to answer a user\u0027s prompt within 1 second.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"JerryWang0000"},"content":"3. Should require less computational resources to allow users with older hardware can use the app without trouble.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"JerryWang0000"},"content":"4. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"JerryWang0000"},"content":"5. Should be able to provide error messages when a user does not type in expected prompts.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"JerryWang0000"},"content":"6. Should be able to store the users\u0027 information securely without leakage.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"JerryWang0000"},"content":"7. Should provide understandable and informative responses whenever a user provides a prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"JerryWang0000"},"content":"8. 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":405,"author":{"gitId":"JerryWang0000"},"content":"9. A user without much experience in admin commands should be able to handle the usage in rather short time.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"JerryWang0000"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS, with versions that support Java 11","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"JerryWang0000"},"content":"* **Users\u0027 Information**: Same as above","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"JerryWang0000"},"content":"* **Error Message**: A prompt printed to the user that the program execution cannot run normally and specifies the most possible cause","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"JerryWang0000"},"content":"* **MSS**: Main Success Scenario","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"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":424,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"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":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"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":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"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":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"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":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"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":458,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"iynixil":18,"JerryWang0000":12,"whitesnowx":76,"-":362}},{"path":"docs/Documentation.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: Documentation guide","lastModifiedDate":"2020-06-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"whitesnowx"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"**Setting up and maintaining the project website:**","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"* We use [**Jekyll**](https://jekyllrb.com/) to manage documentation.","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"* The `docs/` folder is used for documentation.","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"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":"2020-06-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* Note these points when adapting the documentation to a different project/product:","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"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":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"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":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"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":"2021-07-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"**Style guidance:**","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Follow the [**_Google developer documentation style guide_**](https://developers.google.com/style).","lastModifiedDate":"2020-06-17"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* Also relevant is the [_[se-edu/guides] **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html)","lastModifiedDate":"2020-06-17"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"**Diagrams:**","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* See the [_[se-edu/guides] **Using PlantUML**_](https://se-education.org/guides/tutorials/plantUml.html)","lastModifiedDate":"2020-06-17"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"**Converting a document to the PDF format:**","lastModifiedDate":"2020-06-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* See the guide [_[se-edu/guides] **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html)","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"whitesnowx":2,"-":29}},{"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":"Pluiexo"},"content":"StaffConnect (SC) is a **desktop app for managing contacts of Professors and Tutors, 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, SC can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"1. Download the latest `StaffConnect.jar` from [here](https://github.com/AY2324S2-CS2103-F08-3/tp/).","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"Pluiexo"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your StaffConnect application.","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"Pluiexo"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar StaffConnect.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"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 contacts list.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"Adds a person to the contacts.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"Shows a list of all persons in the contacts.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"Edits an existing person in the contacts.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"Deletes the specified person from the contacts.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the contacts.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"Clears all entries from the contacts.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"StaffConnect 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-07"},{"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":"Pluiexo"},"content":"StaffConnect data are saved automatically as a JSON file `[JAR file location]/data/StaffConnect.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-07"},{"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":"Pluiexo"},"content":"If your changes to the data file makes its format invalid, StaffConnect 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-07"},{"lineNumber":166,"author":{"gitId":"Pluiexo"},"content":"Furthermore, certain edits can cause the StaffConnect 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-07"},{"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":"Pluiexo"},"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 StaffConnect home folder.","lastModifiedDate":"2024-03-07"},{"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":{"Pluiexo":17,"-":181}},{"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":"Pluiexo"},"content":"title: StaffConnect","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":"Pluiexo"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103-F08-3/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Pluiexo"},"content":"[![codecov](https://codecov.io/gh/Pluiexo/tp/graph/badge.svg?token\u003d2UVL2OKOKL)](https://codecov.io/gh/Pluiexo/tp)","lastModifiedDate":"2024-03-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":"Pluiexo"},"content":"**StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues.**","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Pluiexo"},"content":"This product allows users to easily identify and connect with educators by providing visual cues alongside contact","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Pluiexo"},"content":"details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"Pluiexo"},"content":"* If you are interested in using StaffConnect, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Pluiexo"},"content":"* If you are interested about developing StaffConnect, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"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":{"Pluiexo":8,"-":13}},{"path":"docs/team/iynixil.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"iynixil"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"iynixil"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Xin Yi\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"iynixil"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"iynixil"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"iynixil"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"iynixil"},"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-06"},{"lineNumber":14,"author":{"gitId":"iynixil"},"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-06"},{"lineNumber":15,"author":{"gitId":"iynixil"},"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-06"},{"lineNumber":16,"author":{"gitId":"iynixil"},"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-06"},{"lineNumber":17,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"iynixil"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"iynixil"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"iynixil"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"iynixil"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"iynixil"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"iynixil"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"iynixil"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"iynixil"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"iynixil"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"iynixil"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"iynixil"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"iynixil"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"iynixil"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"iynixil"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"iynixil"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"iynixil"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"iynixil"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"iynixil"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"iynixil"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"iynixil"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"iynixil"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"iynixil"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"iynixil"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"iynixil":43,"Pluiexo":3}},{"path":"docs/team/jerrywang0000.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JerryWang0000"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"JerryWang0000"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"JerryWang0000"},"content":"title: Jerry Wang\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"JerryWang0000"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"JerryWang0000"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"JerryWang0000"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"JerryWang0000"},"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-06"},{"lineNumber":14,"author":{"gitId":"JerryWang0000"},"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-06"},{"lineNumber":15,"author":{"gitId":"JerryWang0000"},"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-06"},{"lineNumber":16,"author":{"gitId":"JerryWang0000"},"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-06"},{"lineNumber":17,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"JerryWang0000"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"JerryWang0000"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"JerryWang0000"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"JerryWang0000"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"JerryWang0000"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"JerryWang0000"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"JerryWang0000"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"JerryWang0000"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"JerryWang0000"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"JerryWang0000"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"JerryWang0000"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"JerryWang0000"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"JerryWang0000"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"JerryWang0000"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"JerryWang0000"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"JerryWang0000"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"JerryWang0000"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"JerryWang0000"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"JerryWang0000"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"JerryWang0000"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"JerryWang0000"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"JerryWang0000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"JerryWang0000"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"JerryWang0000":44,"Pluiexo":2}},{"path":"docs/team/pluiexo.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":"Pluiexo"},"content":"title: Norton\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":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"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":{"Pluiexo":3,"-":43}},{"path":"docs/team/tsulim.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tsulim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"tsulim"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Pluiexo"},"content":"title: Xiu Jia\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"tsulim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"tsulim"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"tsulim"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"tsulim"},"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-06"},{"lineNumber":14,"author":{"gitId":"tsulim"},"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-06"},{"lineNumber":15,"author":{"gitId":"tsulim"},"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-06"},{"lineNumber":16,"author":{"gitId":"tsulim"},"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-06"},{"lineNumber":17,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"tsulim"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"tsulim"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"tsulim"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"tsulim"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"tsulim"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"tsulim"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"tsulim"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"tsulim"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"tsulim"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"tsulim"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"tsulim"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"tsulim"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"tsulim"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"tsulim"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"tsulim"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"tsulim"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"tsulim"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"tsulim"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"tsulim"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"tsulim"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"tsulim"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"tsulim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"tsulim"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"tsulim":43,"Pluiexo":3}},{"path":"docs/team/whitesnowx.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"whitesnowx"},"content":"title: Wong\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Pluiexo"},"content":"### Project: StaffConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Pluiexo"},"content":"StaffConnect offers convenience and peace of mind to a struggling student with memory recollection issues. This product allows users to easily identify and connect with educators by providing visual cues alongside contact details, supported by a quick and easy filter system. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"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":"2024-03-06"},{"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":"2024-03-06"},{"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":"2024-03-06"},{"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":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"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":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Pluiexo":2,"whitesnowx":1,"-":43}}] diff --git a/AY2324S2-CS2103-F08-3_tp_master/commits.json b/AY2324S2-CS2103-F08-3_tp_master/commits.json index c29b9f84..81a762b9 100644 --- a/AY2324S2-CS2103-F08-3_tp_master/commits.json +++ b/AY2324S2-CS2103-F08-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"tsulim":[{"date":"2024-03-06","commitResults":[{"hash":"496b682de95e9697ae65e6b6b4263ec8f8386974","isMergeCommit":true,"messageTitle":"Merge pull request #30 from iynixil/update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"bba0a78418d5ed6d6e6e6dfcf281f22151aa61b8","isMergeCommit":true,"messageTitle":"Merge pull request #32 from whitesnowx/send-to-teemrepo","messageBody":"Update on DG and AboutUs","fileTypesAndContributionMap":{}},{"hash":"d27f74cea215e1615d54f79ff2599c87277b9e4d","isMergeCommit":false,"messageTitle":"Update aboutus page with my details and photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"36404ac1b986c5ba38e78e40c05a1e18940046ac","isMergeCommit":false,"messageTitle":"Update file names to follow format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"d35422275b62023adb1f849b611fbeca4f0bde11","isMergeCommit":true,"messageTitle":"Merge pull request #37 from Pluiexo/update-readme","messageBody":"Update Readme to fit StaffConnect","fileTypesAndContributionMap":{}},{"hash":"45ee2274d271d6bc4dd4ccf19c2db75de4621326","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Pluiexo/update-AboutUs","messageBody":"","fileTypesAndContributionMap":{}}]}],"iynixil":[{"date":"2024-03-06","commitResults":[{"hash":"b69e5d7a0a4211e83bb7a59bc9067b548f1c690c","isMergeCommit":false,"messageTitle":"Update DG: Target user profile, value proposition, user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":14}}},{"hash":"46a6c5a2e602258f9ebc30e40bc4c66d11366619","isMergeCommit":true,"messageTitle":"Merge pull request #29 from whitesnowx/add-calistaWong-info","messageBody":"add calistawong information into about us","fileTypesAndContributionMap":{}},{"hash":"28d30e307842f7cae25a6b05730d82dbff822e32","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"df4173e5996779ec0b3a1ecf59a7904e4f6d93bf","isMergeCommit":false,"messageTitle":"Update AboutUs: Add iynixil","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}}]}],"JerryWang0000":[{"date":"2024-03-06","commitResults":[{"hash":"eabf0a37ba0560b403b570ed80a9da958dd1e175","isMergeCommit":false,"messageTitle":"Update AboutUs for Jerry Wang","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"c647c0f81e9742de96f410ee44fffbc1d9914f19","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Add content to NFR and Glossary in Appendix: Requirements.\n","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":4}}},{"hash":"8f808904be57991be391b6c8bdca3439870aa1cc","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Fix some minor typos.\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"Pluiexo":[{"date":"2024-02-24","commitResults":[{"hash":"1b288a389a0e1f55e25dd452836bb805c77fa4a2","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"0924dab2e37221f49e3959f250a1b22c8ab7011d","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"102d1016e3cf738f4e30c7ae99801f680dd3a375","isMergeCommit":false,"messageTitle":"Update Readme to fit StaffConnect","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":11}}},{"hash":"06a42be2da3a848cc003441098ce9ee6335e0d5b","isMergeCommit":true,"messageTitle":"Merge pull request #36 from JerryWang0000/update-DeveloperGuide","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}},{"hash":"5d72703ae863e01cae2520b7edf297e442d5d71b","isMergeCommit":false,"messageTitle":"Update github info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"0cdf1eed25dc865abfa0e90cf79f1b23e02b7988","isMergeCommit":false,"messageTitle":"Amend Readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":3}}},{"hash":"66fcb566fe9d9f5b49bb7acaf5e3f24714575131","isMergeCommit":false,"messageTitle":"Add pluiexo.md page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":14}}}]}],"whitesnowx":[{"date":"2024-03-06","commitResults":[{"hash":"089a34f600f78b52b02650fd7d490561c10aad61","isMergeCommit":true,"messageTitle":"Merge pull request #28 from iynixil/update-dg","messageBody":"Update DG: Target user profile, value proposition, user stories","fileTypesAndContributionMap":{}},{"hash":"fa5c7a7fd22078d75fb2bb45a69495c1b2644ef4","isMergeCommit":false,"messageTitle":"add calistawong information into about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":6}}},{"hash":"20cf643180fb39468ed2eb5284c9198d8f9f9f38","isMergeCommit":false,"messageTitle":"Updated use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":10}}},{"hash":"ce301ee039801ecc4b73881f225e5ee81e498b17","isMergeCommit":true,"messageTitle":"Merge pull request #31 from JerryWang0000/update-AboutUs-JerryWang","messageBody":"Update AboutUs for Jerry Wang","fileTypesAndContributionMap":{}},{"hash":"100757221b911543e60f4a916cc1c0d5e1d1b6a1","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into send-to-teemrepo","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8de755708a437b67433170480eb848fed700b8f7","isMergeCommit":false,"messageTitle":"update aboutus info to name match lowercase requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"a33d0ec96e566e85d6ba142dc9fa76d232c61641","isMergeCommit":false,"messageTitle":"changed names to match github names","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"ccf56a16518e8ff9ada9bfdf57190872435071b4","isMergeCommit":false,"messageTitle":"aboutus update file name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3a242712a73c50e666e1ae376f0ba54929cb2ed0","isMergeCommit":false,"messageTitle":"Change use case for filter and typo in sort","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"870493742f147d46aa54ef4f9477ab92e87428ce","isMergeCommit":false,"messageTitle":"Update typos","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-07","commitResults":[{"hash":"d2d947017a127c9b49c204350a92c2d22106d1cb","isMergeCommit":true,"messageTitle":"Merge pull request #33 from tsulim/branch_update_aboutus","messageBody":"Update aboutus page","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"tsulim":{"docs":52,"functional-code":0,"test-code":0},"iynixil":{"docs":65,"functional-code":0,"test-code":0},"JerryWang0000":{"docs":60,"functional-code":0,"test-code":0},"Pluiexo":{"docs":40,"functional-code":0,"test-code":0},"whitesnowx":{"docs":84,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tsulim":221.95918,"iynixil":502.02548,"JerryWang0000":235.82143,"Pluiexo":371.0867,"whitesnowx":2101.49},"authorDisplayNameMap":{"tsulim":"CS2103-F08-3 LIM .. JIA","iynixil":"CS2103-F08-3 LI X..INYI","JerryWang0000":"CS2103-F08-3 WANG..HUAI","Pluiexo":"CS2103-F08-3 NORT.. XUN","whitesnowx":"CS2103-F08-3 CALI..PING"}} +{"authorDailyContributionsMap":{"tsulim":[{"date":"2024-03-06","commitResults":[{"hash":"496b682de95e9697ae65e6b6b4263ec8f8386974","isMergeCommit":true,"messageTitle":"Merge pull request #30 from iynixil/update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"bba0a78418d5ed6d6e6e6dfcf281f22151aa61b8","isMergeCommit":true,"messageTitle":"Merge pull request #32 from whitesnowx/send-to-teemrepo","messageBody":"Update on DG and AboutUs","fileTypesAndContributionMap":{}},{"hash":"d27f74cea215e1615d54f79ff2599c87277b9e4d","isMergeCommit":false,"messageTitle":"Update aboutus page with my details and photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"36404ac1b986c5ba38e78e40c05a1e18940046ac","isMergeCommit":false,"messageTitle":"Update file names to follow format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"d35422275b62023adb1f849b611fbeca4f0bde11","isMergeCommit":true,"messageTitle":"Merge pull request #37 from Pluiexo/update-readme","messageBody":"Update Readme to fit StaffConnect","fileTypesAndContributionMap":{}},{"hash":"45ee2274d271d6bc4dd4ccf19c2db75de4621326","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Pluiexo/update-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"40035a3c7233fd673b99b36cdad682330f628293","isMergeCommit":true,"messageTitle":"Merge pull request #39 from Pluiexo/branch-update-UG","messageBody":"Update Website Index and UserGuide","fileTypesAndContributionMap":{}}]}],"iynixil":[{"date":"2024-03-06","commitResults":[{"hash":"b69e5d7a0a4211e83bb7a59bc9067b548f1c690c","isMergeCommit":false,"messageTitle":"Update DG: Target user profile, value proposition, user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":14}}},{"hash":"46a6c5a2e602258f9ebc30e40bc4c66d11366619","isMergeCommit":true,"messageTitle":"Merge pull request #29 from whitesnowx/add-calistaWong-info","messageBody":"add calistawong information into about us","fileTypesAndContributionMap":{}},{"hash":"28d30e307842f7cae25a6b05730d82dbff822e32","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"df4173e5996779ec0b3a1ecf59a7904e4f6d93bf","isMergeCommit":false,"messageTitle":"Update AboutUs: Add iynixil","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}}]}],"JerryWang0000":[{"date":"2024-03-06","commitResults":[{"hash":"eabf0a37ba0560b403b570ed80a9da958dd1e175","isMergeCommit":false,"messageTitle":"Update AboutUs for Jerry Wang","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"c647c0f81e9742de96f410ee44fffbc1d9914f19","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Add content to NFR and Glossary in Appendix: Requirements.\n","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":4}}},{"hash":"8f808904be57991be391b6c8bdca3439870aa1cc","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Fix some minor typos.\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"Pluiexo":[{"date":"2024-02-24","commitResults":[{"hash":"1b288a389a0e1f55e25dd452836bb805c77fa4a2","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"0924dab2e37221f49e3959f250a1b22c8ab7011d","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"102d1016e3cf738f4e30c7ae99801f680dd3a375","isMergeCommit":false,"messageTitle":"Update Readme to fit StaffConnect","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":11}}},{"hash":"06a42be2da3a848cc003441098ce9ee6335e0d5b","isMergeCommit":true,"messageTitle":"Merge pull request #36 from JerryWang0000/update-DeveloperGuide","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}},{"hash":"5d72703ae863e01cae2520b7edf297e442d5d71b","isMergeCommit":false,"messageTitle":"Update github info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"0cdf1eed25dc865abfa0e90cf79f1b23e02b7988","isMergeCommit":false,"messageTitle":"Amend Readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":3}}},{"hash":"66fcb566fe9d9f5b49bb7acaf5e3f24714575131","isMergeCommit":false,"messageTitle":"Add pluiexo.md page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":14}}},{"hash":"42482fb8c9eae3c300049f16148e85ef00ce553e","isMergeCommit":false,"messageTitle":"Update website main index","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":6}}},{"hash":"b37a6a411b4bc6cc25420a1ac010c7f23ddd031a","isMergeCommit":false,"messageTitle":"Update UserGuide description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":17}}},{"hash":"bf6fbe50e26b631bc3d4fec22aa8670225e8969f","isMergeCommit":false,"messageTitle":"Fix typos and added clarity","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"whitesnowx":[{"date":"2024-03-06","commitResults":[{"hash":"089a34f600f78b52b02650fd7d490561c10aad61","isMergeCommit":true,"messageTitle":"Merge pull request #28 from iynixil/update-dg","messageBody":"Update DG: Target user profile, value proposition, user stories","fileTypesAndContributionMap":{}},{"hash":"fa5c7a7fd22078d75fb2bb45a69495c1b2644ef4","isMergeCommit":false,"messageTitle":"add calistawong information into about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":6}}},{"hash":"20cf643180fb39468ed2eb5284c9198d8f9f9f38","isMergeCommit":false,"messageTitle":"Updated use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":10}}},{"hash":"ce301ee039801ecc4b73881f225e5ee81e498b17","isMergeCommit":true,"messageTitle":"Merge pull request #31 from JerryWang0000/update-AboutUs-JerryWang","messageBody":"Update AboutUs for Jerry Wang","fileTypesAndContributionMap":{}},{"hash":"100757221b911543e60f4a916cc1c0d5e1d1b6a1","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into send-to-teemrepo","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8de755708a437b67433170480eb848fed700b8f7","isMergeCommit":false,"messageTitle":"update aboutus info to name match lowercase requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"a33d0ec96e566e85d6ba142dc9fa76d232c61641","isMergeCommit":false,"messageTitle":"changed names to match github names","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"ccf56a16518e8ff9ada9bfdf57190872435071b4","isMergeCommit":false,"messageTitle":"aboutus update file name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3a242712a73c50e666e1ae376f0ba54929cb2ed0","isMergeCommit":false,"messageTitle":"Change use case for filter and typo in sort","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"870493742f147d46aa54ef4f9477ab92e87428ce","isMergeCommit":false,"messageTitle":"Update typos","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-07","commitResults":[{"hash":"d2d947017a127c9b49c204350a92c2d22106d1cb","isMergeCommit":true,"messageTitle":"Merge pull request #33 from tsulim/branch_update_aboutus","messageBody":"Update aboutus page","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"tsulim":{"docs":52,"functional-code":0,"test-code":0},"iynixil":{"docs":65,"functional-code":0,"test-code":0},"JerryWang0000":{"docs":60,"functional-code":0,"test-code":0},"Pluiexo":{"docs":65,"functional-code":0,"test-code":0},"whitesnowx":{"docs":84,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tsulim":221.95918,"iynixil":502.02548,"JerryWang0000":235.82143,"Pluiexo":1065.6582,"whitesnowx":2101.49},"authorDisplayNameMap":{"tsulim":"CS2103-F08-3 LIM .. JIA","iynixil":"CS2103-F08-3 LI X..INYI","JerryWang0000":"CS2103-F08-3 WANG..HUAI","Pluiexo":"CS2103-F08-3 NORT.. XUN","whitesnowx":"CS2103-F08-3 CALI..PING"}} diff --git a/AY2324S2-CS2103-F15-3_tp_master/authorship.json b/AY2324S2-CS2103-F15-3_tp_master/authorship.json index 0d3421d0..e5536fc3 100644 --- a/AY2324S2-CS2103-F15-3_tp_master/authorship.json +++ b/AY2324S2-CS2103-F15-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) [![codecov](https://codecov.io/gh/AY2324S2-CS2103-F15-3/tp/graph/badge.svg?token\u003dNYM3SACDB7)](https://codecov.io/gh/AY2324S2-CS2103-F15-3/tp)","lastModifiedDate":"2024-02-19"},{"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":"## HRConnect","lastModifiedDate":"2024-02-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":7,"author":{"gitId":"lihaoquan"},"content":"HRConnect is designed for HR officers in tech startups, streamlining the management of external contacts.","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"lihaoquan"},"content":"It efficiently organizes contacts for potential hires, hiring agencies, and legal consultants, significantly","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"lihaoquan"},"content":"reducing the time spent searching for contact information, thereby optimizing the recruiting process.","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"lihaoquan"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"lihaoquan":5,"-":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":"lihaoquan"},"content":"### Yong Yu Sian","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/ys112.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"lihaoquan"},"content":"[[github](https://github.com/ys112)]","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/ys112.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"lihaoquan"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"YuvBindal"},"content":"### Yuv Bindal","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/yuvbindal.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"lihaoquan"},"content":"[[github](http://github.com/YuvBindal)]","lastModifiedDate":"2024-02-26"},{"lineNumber":27,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/yuvbindal.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"YuvBindal"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":30,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"lihaoquan"},"content":"### Lee Xin En","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/xinen26.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"lihaoquan"},"content":"[[github](http://github.com/xinen26)]","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/xinen26.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"lihaoquan"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"lihaoquan"},"content":"### Ho Wei Herng, Christopher","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/chrisho1341.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"lihaoquan"},"content":"[[github](http://github.com/ChrisHo1341)]","lastModifiedDate":"2024-02-26"},{"lineNumber":47,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/chrisho1341.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"lihaoquan"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":50,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development","lastModifiedDate":"2024-02-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"lihaoquan"},"content":"### Li Haoquan","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/lihaoquan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"lihaoquan"},"content":"[[github](http://github.com/lihaoquan)]","lastModifiedDate":"2024-02-26"},{"lineNumber":57,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/lihaoquan.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"lihaoquan"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development, UI","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"lihaoquan":28,"YuvBindal":2,"-":30}},{"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":"ys112"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-26"},{"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":"ys112"},"content":"**Target user profile**: HR officer for tech-related startup","lastModifiedDate":"2024-02-26"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"ys112"},"content":"**Value proposition**:","lastModifiedDate":"2024-02-26"},{"lineNumber":266,"author":{"gitId":"ys112"},"content":"* Managing contacts for three main types of external liaisons: ","lastModifiedDate":"2024-02-26"},{"lineNumber":267,"author":{"gitId":"ys112"},"content":" * potential hires","lastModifiedDate":"2024-02-26"},{"lineNumber":268,"author":{"gitId":"ys112"},"content":" * hiring agencies","lastModifiedDate":"2024-02-26"},{"lineNumber":269,"author":{"gitId":"ys112"},"content":" * legal consultants","lastModifiedDate":"2024-02-26"},{"lineNumber":270,"author":{"gitId":"ys112"},"content":"* Reduce time spent on searching for relevant contacts for liaisons.","lastModifiedDate":"2024-02-26"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"ys112"},"content":"Priorities: Essential (needed for basic functionality) - `Essential`, Typical (common needs) - `Typical`, Novel (good to have but not a need) - `Novel`, Out of Scope (not needed) - `Out of Scope`","lastModifiedDate":"2024-02-26"},{"lineNumber":275,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":276,"author":{"gitId":"ys112"},"content":"| As a/an ... | I can ... | So that ... | Priority (Essential, Typical, Novel, Out of Scope) |","lastModifiedDate":"2024-02-26"},{"lineNumber":277,"author":{"gitId":"ys112"},"content":"| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |----------------------------------------------------|","lastModifiedDate":"2024-02-26"},{"lineNumber":278,"author":{"gitId":"ys112"},"content":"| User | add new contacts | | Essential |","lastModifiedDate":"2024-02-26"},{"lineNumber":279,"author":{"gitId":"ys112"},"content":"| User | delete existing contacts | | Essential |","lastModifiedDate":"2024-02-26"},{"lineNumber":280,"author":{"gitId":"ys112"},"content":"| User | view existing contacts | | Essential |","lastModifiedDate":"2024-02-26"},{"lineNumber":281,"author":{"gitId":"ys112"},"content":"| HR professional | manage all my work contacts in one place, | I can efficiently communicate with recruitment agencies, candidates and other stakeholders | Essential |","lastModifiedDate":"2024-02-26"},{"lineNumber":282,"author":{"gitId":"ys112"},"content":"| User | update existing contacts | | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":283,"author":{"gitId":"ys112"},"content":"| User | purge all curent data | I can get rid of sample/experimental data I while exploring the app | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":284,"author":{"gitId":"ys112"},"content":"| HR Recruiter | filter through my contact list based on what stage of the hiring process the applicants are in | I can contact those who are shortlisted | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":285,"author":{"gitId":"ys112"},"content":"| HR Recruiter | add tags to contacts to specify which roles they are applying for | I can keep them organized | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":286,"author":{"gitId":"ys112"},"content":"| HR personnel | add notes or comments to individual contact entries | I can keep track of important additional information/interactions | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":287,"author":{"gitId":"ys112"},"content":"| experienced HR professional | filter and identify candidates by tags | I can follow up with them promptly | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":288,"author":{"gitId":"ys112"},"content":"| User | search through my contacts based on specific criteria | I can quickly find any information I need | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":289,"author":{"gitId":"ys112"},"content":"| HR Recruiter | extract contacts into a separate address book | I can import them to the company database easily | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":290,"author":{"gitId":"ys112"},"content":"| HR Recruiter | upload images to set profile pictures for my contacts | I can identify them when face to face | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":291,"author":{"gitId":"ys112"},"content":"| first-time user | have an intuitive experience and can quickly understand its features and functionalities | I can start using it effectively without wasting time | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":292,"author":{"gitId":"ys112"},"content":"| first-time user | can find clear instructions on how to use HRConnect | I can easily start managing my contacts using HRConnect | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":293,"author":{"gitId":"ys112"},"content":"| HR Recruiter | Create new contacts with templates based on person (employees, intern, interviewee etc.) | | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":294,"author":{"gitId":"ys112"},"content":"| long-time user | create shortcuts for tasks | I can save time on frequenty used functions | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":295,"author":{"gitId":"ys112"},"content":"| User | receive notifications or reminders from HRConnect | I can be kept up to date with upcoming interviews, deadlines or follow-up tasks | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":296,"author":{"gitId":"ys112"},"content":"| User | can conduct background checks on potential hires directly within HRConnect | I can find out the suitability of a candidate easily | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":297,"author":{"gitId":"ys112"},"content":"| first-time user | easily import my data | it won\u0027t be intimidating and I won\u0027t give up on using it after my first use | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":298,"author":{"gitId":"ys112"},"content":"| HR personnel | sync any information changes across different devices | I can update information efficiently and ensure that all data is up to date for my coworkers as well | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":299,"author":{"gitId":"ys112"},"content":"| long-time user. | archive/hide unused contacts | I am not distracted by irrelevant data | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":300,"author":{"gitId":"ys112"},"content":"| HR Recruiter | create custom automated processes for repetitive tasks | I can save time on such tasks | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":301,"author":{"gitId":"ys112"},"content":"| potential user exploring the app | see the app populated with sample data | I can easily see the benefits of the app when frequently used | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":302,"author":{"gitId":"ys112"},"content":"| HR personnel | keep track of the status of job applications or recruitment processes for each candidate | I can monitor progress and follow up as needed | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":303,"author":{"gitId":"ys112"},"content":"| User | track the status of each potential hire in the recruitment process | I can take action as needed | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":304,"author":{"gitId":"ys112"},"content":"| User | conduct surveys and collect feedback from specific groups within my contacts | I can easily conduct surveys as needed | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":305,"author":{"gitId":"ys112"},"content":"| first-time user | access a brief tutorial on how to navigate HRConnect | I can quickly familiarize myself with its features and functions | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":306,"author":{"gitId":"ys112"},"content":"| User | generate reports or analytics on hiring activities such as time-to-fill metrics, source of hire, and diversity statistics | I can easily access such information as needed | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":307,"author":{"gitId":"ys112"},"content":"| User | integrate HRConnect with other HR systems or tools such as applicant tracking systems or payroll software | data exchange and workflows can be streamlined | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":308,"author":{"gitId":"ys112"},"content":"| User | schedule and conduct virtual interviews directly within HRConnect, including video conferencing and interview notes | | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":309,"author":{"gitId":"ys112"},"content":"| User | track and manage employee referrals and incentives programs within HRConnect, including tracking referral bonuses and monitoring the effectiveness of referral campaigns | | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":310,"author":{"gitId":"ys112"},"content":"| User | generate customizable offer letters and employment contracts directly within HRConnect, including integrating e-signature solutions | I can perform these tasks more efficiently | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":311,"author":{"gitId":"ys112"},"content":"| User | create and manage employee development plans with HRConnect | | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":312,"author":{"gitId":"ys112"},"content":"| User | create and manage succession plans with HRConnect, including identifying high-potential employees, mapping career paths and planning for leadership transitions | | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"xinen26"},"content":"(For all use cases below, the **System** is the `HRConnect` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-02-27"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":319,"author":{"gitId":"xinen26"},"content":"**Use case: Add a contact**","lastModifiedDate":"2024-02-27"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":321,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":322,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":323,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":324,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":325,"author":{"gitId":"xinen26"},"content":"3. User requests to add a specific contact to the list","lastModifiedDate":"2024-02-27"},{"lineNumber":326,"author":{"gitId":"xinen26"},"content":"4. HRConnect adds the contact","lastModifiedDate":"2024-02-27"},{"lineNumber":327,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":328,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":329,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":330,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":332,"author":{"gitId":"xinen26"},"content":"* 3a. The given format is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":334,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":335,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":336,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":337,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":338,"author":{"gitId":"xinen26"},"content":"* 3b. The contact details have been added before.","lastModifiedDate":"2024-02-27"},{"lineNumber":339,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":340,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":341,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":342,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":343,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":344,"author":{"gitId":"xinen26"},"content":"**Use case: Clear**","lastModifiedDate":"2024-02-27"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":346,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":348,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":349,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":350,"author":{"gitId":"xinen26"},"content":"3. User requests to clear the list","lastModifiedDate":"2024-02-27"},{"lineNumber":351,"author":{"gitId":"xinen26"},"content":"4. HRConnect deletes all entries in list","lastModifiedDate":"2024-02-27"},{"lineNumber":352,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":353,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":354,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":355,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":356,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":357,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":358,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":359,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":360,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":361,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":362,"author":{"gitId":"xinen26"},"content":"**Use case: Add comment to contact**","lastModifiedDate":"2024-02-27"},{"lineNumber":363,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":364,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":365,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":366,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":367,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":368,"author":{"gitId":"xinen26"},"content":"3. User requests to add a comment to a specific person in the list","lastModifiedDate":"2024-02-27"},{"lineNumber":369,"author":{"gitId":"xinen26"},"content":"4. HRConnect adds comment to the person","lastModifiedDate":"2024-02-27"},{"lineNumber":370,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":371,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":372,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":373,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":374,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":375,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":376,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":377,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":378,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":379,"author":{"gitId":"xinen26"},"content":"* 3a. The given Application ID is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":380,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":381,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":382,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":383,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":384,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":385,"author":{"gitId":"xinen26"},"content":"* 3b. The comment is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":386,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":387,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":388,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":389,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":390,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":391,"author":{"gitId":"xinen26"},"content":"* 3c. The comment is a duplicate of a previous comment assigned to the same contact.","lastModifiedDate":"2024-02-27"},{"lineNumber":392,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":393,"author":{"gitId":"xinen26"},"content":" * 3c1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":394,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":395,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":396,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"xinen26"},"content":"**Use case: Delete a contact**","lastModifiedDate":"2024-02-27"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":403,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":404,"author":{"gitId":"xinen26"},"content":"3. User requests to delete a specific contact on the list","lastModifiedDate":"2024-02-27"},{"lineNumber":405,"author":{"gitId":"xinen26"},"content":"4. HRConnect deletes the person","lastModifiedDate":"2024-02-27"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":422,"author":{"gitId":"xinen26"},"content":"**Use case: Edit a person**","lastModifiedDate":"2024-02-27"},{"lineNumber":423,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":424,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":425,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":426,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":427,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":428,"author":{"gitId":"xinen26"},"content":"3. User requests to edit a specific person\u0027s details in the list","lastModifiedDate":"2024-02-27"},{"lineNumber":429,"author":{"gitId":"xinen26"},"content":"4. HRConnect edits the details belonging to the person","lastModifiedDate":"2024-02-27"},{"lineNumber":430,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":431,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":432,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":433,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":434,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":435,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":436,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":437,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":438,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":439,"author":{"gitId":"xinen26"},"content":"* 3a. The given index of the person is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":440,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":441,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":443,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":445,"author":{"gitId":"xinen26"},"content":"* 3b. The given format of the command is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":446,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":447,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":448,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":449,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":450,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":451,"author":{"gitId":"xinen26"},"content":"**Use case: Export contacts**","lastModifiedDate":"2024-02-27"},{"lineNumber":452,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":453,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":454,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":455,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":456,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":457,"author":{"gitId":"xinen26"},"content":"3. User requests to export contacts into a separate address book section.","lastModifiedDate":"2024-02-27"},{"lineNumber":458,"author":{"gitId":"xinen26"},"content":"4. HRConnect exports the specified range of contacts to the designated page.","lastModifiedDate":"2024-02-27"},{"lineNumber":459,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":460,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":461,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":462,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":463,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":464,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":465,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":466,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":467,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":468,"author":{"gitId":"xinen26"},"content":"* 3a. The given format of the command is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":469,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":470,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":471,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":472,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":473,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":474,"author":{"gitId":"xinen26"},"content":"* 3b. The given range is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":475,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":476,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":477,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":478,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":479,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":480,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":481,"author":{"gitId":"xinen26"},"content":"**Use case: Filter Tag**","lastModifiedDate":"2024-02-27"},{"lineNumber":482,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":483,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":484,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":485,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":486,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":487,"author":{"gitId":"xinen26"},"content":"3. User requests to filter through the contact list based on what stage the interviewee is in","lastModifiedDate":"2024-02-27"},{"lineNumber":488,"author":{"gitId":"xinen26"},"content":"4. HRConnect returns entries only for interviewees in that particular stage. ","lastModifiedDate":"2024-02-27"},{"lineNumber":489,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":490,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":491,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":492,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":493,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":494,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":495,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":496,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":497,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":498,"author":{"gitId":"xinen26"},"content":"* 3a. The given format of the command is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":499,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":500,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":501,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":502,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":503,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":504,"author":{"gitId":"xinen26"},"content":"* 3b. The tag does not exist.","lastModifiedDate":"2024-02-27"},{"lineNumber":505,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":506,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":507,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":508,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":509,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":510,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":511,"author":{"gitId":"xinen26"},"content":"**Use case: Find keyword**","lastModifiedDate":"2024-02-27"},{"lineNumber":512,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":513,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":514,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":515,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":516,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":517,"author":{"gitId":"xinen26"},"content":"3. User requests to find entries that match the keyword in the list","lastModifiedDate":"2024-02-27"},{"lineNumber":518,"author":{"gitId":"xinen26"},"content":"4. HRConnect returns entries that match the keyword","lastModifiedDate":"2024-02-27"},{"lineNumber":519,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":520,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":521,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":522,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":523,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":524,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":525,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":526,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":527,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":528,"author":{"gitId":"xinen26"},"content":"**Use case: List**","lastModifiedDate":"2024-02-27"},{"lineNumber":529,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":530,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":531,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":532,"author":{"gitId":"xinen26"},"content":"1. User requests to list persons","lastModifiedDate":"2024-02-27"},{"lineNumber":533,"author":{"gitId":"xinen26"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-02-27"},{"lineNumber":534,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":535,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":536,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":537,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":538,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":539,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":540,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":541,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":542,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":543,"author":{"gitId":"xinen26"},"content":"**Use case: Add tag**","lastModifiedDate":"2024-02-27"},{"lineNumber":544,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":545,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":546,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":547,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":548,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":549,"author":{"gitId":"xinen26"},"content":"3. User requests to add specific tags to specific contacts for easy filtering later.","lastModifiedDate":"2024-02-27"},{"lineNumber":550,"author":{"gitId":"xinen26"},"content":"4. HRConnect adds the specified tag to the designated contact.","lastModifiedDate":"2024-02-27"},{"lineNumber":551,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":552,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":553,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":554,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":555,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":556,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":557,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":558,"author":{"gitId":"xinen26"},"content":"* 3a. The application ID does not exist.","lastModifiedDate":"2024-02-27"},{"lineNumber":559,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":560,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":561,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":562,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":563,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":564,"author":{"gitId":"xinen26"},"content":"* 3b. The tag does not exist.","lastModifiedDate":"2024-02-27"},{"lineNumber":565,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":566,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":567,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":568,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":569,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":570,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":571,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":572,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":573,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":574,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":575,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"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":578,"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":579,"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":580,"author":{"gitId":"YuvBindal"},"content":"4. Searches, additions, and updates to contacts should be processed within 2 seconds under normal operational conditions.","lastModifiedDate":"2024-03-04"},{"lineNumber":581,"author":{"gitId":"YuvBindal"},"content":"5. HRConnect should feature an intuitive user interface for easy management of contacts without prior training.","lastModifiedDate":"2024-03-04"},{"lineNumber":582,"author":{"gitId":"YuvBindal"},"content":"6. The system should provide clear error messages and guidance for correcting invalid inputs.","lastModifiedDate":"2024-03-04"},{"lineNumber":583,"author":{"gitId":"YuvBindal"},"content":"7. User data, including contacts, notes, and tags, must be securely handled both in transit and at rest.","lastModifiedDate":"2024-03-04"},{"lineNumber":584,"author":{"gitId":"YuvBindal"},"content":"8. The system should be designed to scale horizontally to accommodate growing numbers of users and contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":585,"author":{"gitId":"YuvBindal"},"content":"9. It should maintain performance and usability as data volume and number of concurrent users increase.","lastModifiedDate":"2024-03-04"},{"lineNumber":586,"author":{"gitId":"YuvBindal"},"content":"10. HRConnect should be available 24/7 with a target uptime of 99.9%, excluding scheduled maintenance.","lastModifiedDate":"2024-03-04"},{"lineNumber":587,"author":{"gitId":"YuvBindal"},"content":"11. It should include mechanisms for data backup and recovery to prevent data loss.","lastModifiedDate":"2024-03-04"},{"lineNumber":588,"author":{"gitId":"YuvBindal"},"content":"12. The system should be compatible with major operating systems (Windows, macOS, Linux) and browsers (Chrome, Firefox, Safari).","lastModifiedDate":"2024-03-04"},{"lineNumber":589,"author":{"gitId":"YuvBindal"},"content":"13. The application should be built using modular, well-documented code to facilitate maintenance and future updates.","lastModifiedDate":"2024-03-04"},{"lineNumber":590,"author":{"gitId":"YuvBindal"},"content":"14. It should allow for the easy addition of new features without significant restructuring of the existing codebase.","lastModifiedDate":"2024-03-04"},{"lineNumber":591,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":592,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":593,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":594,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":595,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":596,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":597,"author":{"gitId":"ChrisHo1341"},"content":"* **Time-to-fill**: Time taken to find and hire a new candidate","lastModifiedDate":"2024-03-07"},{"lineNumber":598,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":599,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":600,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":601,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":602,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":603,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":604,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":605,"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":606,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":607,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":608,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":609,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":610,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":611,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":612,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":613,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":614,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":615,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":616,"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":617,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":618,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":619,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":620,"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":621,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":622,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":623,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":624,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":625,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":626,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":627,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":628,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":629,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":630,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":631,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":632,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":633,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":634,"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":635,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":636,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":637,"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":638,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":639,"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":640,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":641,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":642,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":643,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":644,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":645,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":646,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":647,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":648,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":649,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":650,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"YuvBindal":11,"ys112":47,"xinen26":229,"-":362,"ChrisHo1341":1}},{"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":"ys112"},"content":"**HRConnect is a Command Line Interface (CLI) optimized desktop application designed for storing contacts of potential hires, hiring agencies, and legal consultants.**","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"ys112"},"content":"By using commands, HR officers can efficiently organize contacts for their recruiting process.","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"{:toc}","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"ys112"},"content":"1. Download the latest `hrconnect.jar` from [here](https://github.com/AY2324S2-CS2103-F15-3/tp/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"ys112"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"ys112"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar hrconnect.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"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":24,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"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":27,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"ys112"},"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 HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"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":"lihaoquan"},"content":"* When users input a command along with its arguments, it will be trimmed (remove leading whitespace, trailing whitespace, and whitespace in between words when there are more than one space) and converted to lowercase for parsing.","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"lihaoquan"},"content":"* When parsing arguments: “John Doe “, “John Doe”, and “ John Doe” will all be converted to “john doe”.","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"lihaoquan"},"content":"* When parsing commands: “/FILTER”, “/FILTER stage_one ”, “ /FILTER STAGE_ONE ” will all be converted to “/filter stage_one”.","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"lihaoquan"},"content":"* Words in angle brackets `\u003c\u003e` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"lihaoquan"},"content":" e.g. in `/filter \u003cTag\u003e`, `\u003cTag\u003e` is a parameter which can be used as `/filter initial_application`.","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"lihaoquan"},"content":"* Parameters can be in any order for `add` and `edit` commands.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"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":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"lihaoquan"},"content":"* Parameters must be in strict order for `filter`, `comment`, `export`, and `tag` command.","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"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":67,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":69,"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":70,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"ys112"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-02-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"ys112"},"content":"### Add an interviewee: `add`","lastModifiedDate":"2024-02-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"ys112"},"content":"Adds an interviewee to the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"ys112"},"content":"Format: `add /n Name /p Phone_Number e/Email a/Address [/t Tag]…​`","lastModifiedDate":"2024-02-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"ys112"},"content":"A interviewee can have any number of tags (including 0)","lastModifiedDate":"2024-02-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"ys112"},"content":"* `add /n John Doe /p 98765432 /e johnDoegmail.com /a John street, block 123, #01-01 /t friend`","lastModifiedDate":"2024-02-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"ys112"},"content":"### Listing all interviewees : `list`","lastModifiedDate":"2024-02-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"ys112"},"content":"Shows a list of all persons in the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"ys112"},"content":"### Editing an interviewee : `edit`","lastModifiedDate":"2024-02-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"ys112"},"content":"Edits an existing interviewee in the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"ys112"},"content":"Format: `edit Index [/n Name] [/p Phone] [/e Email] [/a Address] [/t Tag]…​`","lastModifiedDate":"2024-02-26"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"ys112"},"content":"* Edits the interviewee at the specified `Index`. The index refers to the index number shown in the displayed interviewee list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-26"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"ys112"},"content":"* When editing tags, the existing tags of the interviewee will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-02-26"},{"lineNumber":107,"author":{"gitId":"ys112"},"content":"* You can remove all the interviewee’s tags by typing `/t` without","lastModifiedDate":"2024-02-26"},{"lineNumber":108,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"ys112"},"content":"* `edit 1 /n 91234567 /e johndoe@example.com` Edits the phone number and email address of the 1st interviewee to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-02-26"},{"lineNumber":112,"author":{"gitId":"ys112"},"content":"* `edit 2 /n Betsy Crower /t` Edits the name of the 2nd interviewee to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-02-26"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"ys112"},"content":"### Locating interviewees by name: `find`","lastModifiedDate":"2024-02-26"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"ys112"},"content":"Format: `find Keyword [More_Keywords]`","lastModifiedDate":"2024-02-26"},{"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":"ys112"},"content":"### Deleting an interviewee : `delete`","lastModifiedDate":"2024-02-26"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"ys112"},"content":"Deletes the specified interviewee from the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"ys112"},"content":"Format: `delete Index`","lastModifiedDate":"2024-02-26"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"ys112"},"content":"* Deletes the interviewee at the specified `Index`.","lastModifiedDate":"2024-02-26"},{"lineNumber":139,"author":{"gitId":"ys112"},"content":"* The index refers to the index number shown in the displayed interviewee list.","lastModifiedDate":"2024-02-26"},{"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":"ys112"},"content":"* `list` followed by `delete 2` deletes the 2nd interviewee in the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":144,"author":{"gitId":"ys112"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st interviewee in the results of the `find` command.","lastModifiedDate":"2024-02-26"},{"lineNumber":145,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":146,"author":{"gitId":"ChrisHo1341"},"content":"### Adding tags to interviewees: `/tag`","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":148,"author":{"gitId":"ChrisHo1341"},"content":"Attaches specific tags to interviewees for easy filtering later","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"ChrisHo1341"},"content":"Format: `/tag \u003cApplicationID\u003e \u003cTag\u003e`","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"ChrisHo1341"},"content":"* Maps `\u003cTag\u003e` to the `\u003cApplicationID\u003e`","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"ChrisHo1341"},"content":"* `ApplicationID` must be a valid ID currently saved in HRConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"ChrisHo1341"},"content":"Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"ChrisHo1341"},"content":"* `/tag 123456 \u003cinitial_application\u003e` maps the tag `\u003cinitial_application\u003e` to applicant 123456","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"ys112"},"content":"### Filtering interviewees by tag : `/filter`","lastModifiedDate":"2024-02-26"},{"lineNumber":159,"author":{"gitId":"ys112"},"content":"Filter through contact list based on what stage the interviewee is in.","lastModifiedDate":"2024-02-26"},{"lineNumber":160,"author":{"gitId":"ys112"},"content":"Format: `/filter \u003cTag\u003e`","lastModifiedDate":"2024-02-26"},{"lineNumber":161,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":162,"author":{"gitId":"ys112"},"content":"* Filters the contact list based on the `\u003cTag\u003e` provided.","lastModifiedDate":"2024-02-26"},{"lineNumber":163,"author":{"gitId":"ys112"},"content":"* Possible values for `\u003cTag\u003e` are `initial_application`, `technical_assessment`, `interview`, `decision_and_offer`.","lastModifiedDate":"2024-02-26"},{"lineNumber":164,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":165,"author":{"gitId":"ys112"},"content":"Examples:","lastModifiedDate":"2024-02-26"},{"lineNumber":166,"author":{"gitId":"ys112"},"content":"* `/filter initial_application` filters the contact list to show only interviewees in the initial application stage.","lastModifiedDate":"2024-02-26"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"xinen26"},"content":"### Adding notes to interviewees by tag : `/comment`","lastModifiedDate":"2024-02-27"},{"lineNumber":169,"author":{"gitId":"xinen26"},"content":"Facilitates the addition of notes or comments to individual interviewee entries.","lastModifiedDate":"2024-02-27"},{"lineNumber":170,"author":{"gitId":"xinen26"},"content":"Format: `/comment \u003cApplicationId\u003e \u003cNote\u003e`","lastModifiedDate":"2024-02-27"},{"lineNumber":171,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":172,"author":{"gitId":"xinen26"},"content":"* Incorporate supplementary notes to enrich the interviewee\u0027s profile.","lastModifiedDate":"2024-02-27"},{"lineNumber":173,"author":{"gitId":"xinen26"},"content":"* Possible values for `\u003cApplicationId\u003e` are integers.","lastModifiedDate":"2024-02-27"},{"lineNumber":174,"author":{"gitId":"xinen26"},"content":"* Possible values for `\u003cNote\u003e` are any non-empty string that provides relevant commentary.","lastModifiedDate":"2024-02-27"},{"lineNumber":175,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":176,"author":{"gitId":"xinen26"},"content":"Examples:","lastModifiedDate":"2024-02-27"},{"lineNumber":177,"author":{"gitId":"xinen26"},"content":"* `/comment 10 “S/Pass Holder”` will add the note “S/Pass Holder” to the applicant identified by ID 10.","lastModifiedDate":"2024-02-27"},{"lineNumber":178,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":179,"author":{"gitId":"YuvBindal"},"content":"### Exporting interviewees contacts by pageId : `/export`","lastModifiedDate":"2024-03-04"},{"lineNumber":180,"author":{"gitId":"ys112"},"content":"Extracts interviewees contacts into a separate HRConnect identified by a pageId","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"YuvBindal"},"content":"Format: /export \u003cContactRange\u003e \u003cpageId\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":182,"author":{"gitId":"YuvBindal"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":183,"author":{"gitId":"YuvBindal"},"content":"* Achieve an additional layer of organisation to properly arrange contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":184,"author":{"gitId":"YuvBindal"},"content":"* Possible values for `\u003cpageId\u003e` are integers.","lastModifiedDate":"2024-03-04"},{"lineNumber":185,"author":{"gitId":"YuvBindal"},"content":"* Possible values for ContactRange are two integers denoting start:end indices.","lastModifiedDate":"2024-03-04"},{"lineNumber":186,"author":{"gitId":"YuvBindal"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":187,"author":{"gitId":"YuvBindal"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":188,"author":{"gitId":"YuvBindal"},"content":"* `/export [0:10] 1` will append contacts 0 to 10 inclusive onto page identified by ID 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":189,"author":{"gitId":"YuvBindal"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"ys112"},"content":"Clears all entries from the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"ys112"},"content":"HRConnect 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-06"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":208,"author":{"gitId":"ys112"},"content":"HRConnect data are saved automatically as a JSON file `[JAR file location]/data/hrconnect.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-06"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":211,"author":{"gitId":"ys112"},"content":"If your changes to the data file makes its format invalid, HRConnect 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-06"},{"lineNumber":212,"author":{"gitId":"ys112"},"content":"Furthermore, certain edits can cause the HRConnect 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-06"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":217,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"ys112"},"content":"**Add** | `add /n Name /p Phone_Number e/Email a/Address [/t Tag]…​`\u003cbr\u003e e.g., `add /n John Doe /p 98765432 /e johnDoe@gmail.com /a John street, block 123, #01-01 /t friend`","lastModifiedDate":"2024-02-26"},{"lineNumber":222,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"ys112"},"content":"**Edit** | `edit Index [/n Name] [/p Phone] [/e Email] [/a Address] [/t Tag]…​`\u003cbr\u003e e.g., `edit 2 /n Betsy Crower /t friend`","lastModifiedDate":"2024-02-26"},{"lineNumber":225,"author":{"gitId":"ys112"},"content":"**Find** | `find Keyword [More_Keywords]`\u003cbr\u003e e.g., `find alice bob charlie`","lastModifiedDate":"2024-02-26"},{"lineNumber":226,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"ys112"},"content":"**Exit** | `exit`","lastModifiedDate":"2024-02-26"},{"lineNumber":229,"author":{"gitId":"ys112"},"content":"**Filter** | `/filter \u003cTag\u003e` \u003cbr\u003e e.g., `/filter initial_application`","lastModifiedDate":"2024-02-26"},{"lineNumber":230,"author":{"gitId":"xinen26"},"content":"**Comment** | `/comment \u003cApplicationId\u003e \u003cNote\u003e` \u003cbr\u003e e.g., `/comment 10 “S/Pass Holder”`","lastModifiedDate":"2024-02-27"},{"lineNumber":231,"author":{"gitId":"YuvBindal"},"content":"**Export** | `/export \u003cContactRange\u003e \u003cpageId\u003e` \u003cbr\u003e e.g., `/export [0:10] 1`","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"lihaoquan":11,"YuvBindal":11,"ys112":52,"xinen26":12,"-":133,"ChrisHo1341":12}},{"path":"docs/team/lihaoquan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"lihaoquan"},"content":"---","lastModifiedDate":"2024-02-26"},{"lineNumber":2,"author":{"gitId":"lihaoquan"},"content":"layout: page","lastModifiedDate":"2024-02-26"},{"lineNumber":3,"author":{"gitId":"lihaoquan"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-26"},{"lineNumber":4,"author":{"gitId":"lihaoquan"},"content":"---","lastModifiedDate":"2024-02-26"},{"lineNumber":5,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":6,"author":{"gitId":"lihaoquan"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":9,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"lihaoquan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"lihaoquan"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":14,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":15,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":16,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":17,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"lihaoquan"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"lihaoquan"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"lihaoquan"},"content":"* **Project management**:","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"lihaoquan"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-26"},{"lineNumber":24,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"lihaoquan"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"lihaoquan"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-26"},{"lineNumber":27,"author":{"gitId":"lihaoquan"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":29,"author":{"gitId":"lihaoquan"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-26"},{"lineNumber":30,"author":{"gitId":"lihaoquan"},"content":" * User Guide:","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"lihaoquan"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"lihaoquan"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"lihaoquan"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"lihaoquan"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":36,"author":{"gitId":"lihaoquan"},"content":"* **Community**:","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"lihaoquan"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"lihaoquan"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-26"},{"lineNumber":39,"author":{"gitId":"lihaoquan"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"lihaoquan"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":42,"author":{"gitId":"lihaoquan"},"content":"* **Tools**:","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"lihaoquan"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"lihaoquan"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"lihaoquan"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"lihaoquan":46}}] +[{"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) [![codecov](https://codecov.io/gh/AY2324S2-CS2103-F15-3/tp/graph/badge.svg?token\u003dNYM3SACDB7)](https://codecov.io/gh/AY2324S2-CS2103-F15-3/tp)","lastModifiedDate":"2024-02-19"},{"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":"## HRConnect","lastModifiedDate":"2024-02-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":7,"author":{"gitId":"lihaoquan"},"content":"HRConnect is designed for HR officers in tech startups, streamlining the management of external contacts.","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"lihaoquan"},"content":"It efficiently organizes contacts for potential hires, hiring agencies, and legal consultants, significantly","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"lihaoquan"},"content":"reducing the time spent searching for contact information, thereby optimizing the recruiting process.","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"lihaoquan"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"lihaoquan":5,"-":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":"lihaoquan"},"content":"### Yong Yu Sian","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/ys112.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"lihaoquan"},"content":"[[github](https://github.com/ys112)]","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/ys112.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"lihaoquan"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"YuvBindal"},"content":"### Yuv Bindal","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/yuvbindal.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"lihaoquan"},"content":"[[github](http://github.com/YuvBindal)]","lastModifiedDate":"2024-02-26"},{"lineNumber":27,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/yuvbindal.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"YuvBindal"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":30,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"lihaoquan"},"content":"### Lee Xin En","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/xinen26.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"lihaoquan"},"content":"[[github](http://github.com/xinen26)]","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/xinen26.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"lihaoquan"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"lihaoquan"},"content":"### Ho Wei Herng, Christopher","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/chrisho1341.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"lihaoquan"},"content":"[[github](http://github.com/ChrisHo1341)]","lastModifiedDate":"2024-02-26"},{"lineNumber":47,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/chrisho1341.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"lihaoquan"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":50,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development","lastModifiedDate":"2024-02-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"lihaoquan"},"content":"### Li Haoquan","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"lihaoquan"},"content":"\u003cimg src\u003d\"images/lihaoquan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"lihaoquan"},"content":"[[github](http://github.com/lihaoquan)]","lastModifiedDate":"2024-02-26"},{"lineNumber":57,"author":{"gitId":"lihaoquan"},"content":"[[portfolio](team/lihaoquan.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"lihaoquan"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"lihaoquan"},"content":"* Responsibilities: Backend development, UI","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"lihaoquan":28,"YuvBindal":2,"-":30}},{"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":"ys112"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-26"},{"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":"ys112"},"content":"**Target user profile**: HR officer for tech-related startup","lastModifiedDate":"2024-02-26"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"ys112"},"content":"**Value proposition**:","lastModifiedDate":"2024-02-26"},{"lineNumber":266,"author":{"gitId":"ys112"},"content":"* Managing contacts for three main types of external liaisons: ","lastModifiedDate":"2024-02-26"},{"lineNumber":267,"author":{"gitId":"ys112"},"content":" * potential hires","lastModifiedDate":"2024-02-26"},{"lineNumber":268,"author":{"gitId":"ys112"},"content":" * hiring agencies","lastModifiedDate":"2024-02-26"},{"lineNumber":269,"author":{"gitId":"ys112"},"content":" * legal consultants","lastModifiedDate":"2024-02-26"},{"lineNumber":270,"author":{"gitId":"ys112"},"content":"* Reduce time spent on searching for relevant contacts for liaisons.","lastModifiedDate":"2024-02-26"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"ys112"},"content":"Priorities: Essential (needed for basic functionality) - `Essential`, Typical (common needs) - `Typical`, Novel (good to have but not a need) - `Novel`, Out of Scope (not needed) - `Out of Scope`","lastModifiedDate":"2024-02-26"},{"lineNumber":275,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":276,"author":{"gitId":"ys112"},"content":"| As a/an ... | I can ... | So that ... | Priority (Essential, Typical, Novel, Out of Scope) |","lastModifiedDate":"2024-02-26"},{"lineNumber":277,"author":{"gitId":"ys112"},"content":"| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |----------------------------------------------------|","lastModifiedDate":"2024-02-26"},{"lineNumber":278,"author":{"gitId":"ys112"},"content":"| User | add new contacts | | Essential |","lastModifiedDate":"2024-02-26"},{"lineNumber":279,"author":{"gitId":"ys112"},"content":"| User | delete existing contacts | | Essential |","lastModifiedDate":"2024-02-26"},{"lineNumber":280,"author":{"gitId":"ys112"},"content":"| User | view existing contacts | | Essential |","lastModifiedDate":"2024-02-26"},{"lineNumber":281,"author":{"gitId":"ys112"},"content":"| HR professional | manage all my work contacts in one place, | I can efficiently communicate with recruitment agencies, candidates and other stakeholders | Essential |","lastModifiedDate":"2024-02-26"},{"lineNumber":282,"author":{"gitId":"ys112"},"content":"| User | update existing contacts | | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":283,"author":{"gitId":"ys112"},"content":"| User | purge all curent data | I can get rid of sample/experimental data I while exploring the app | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":284,"author":{"gitId":"ys112"},"content":"| HR Recruiter | filter through my contact list based on what stage of the hiring process the applicants are in | I can contact those who are shortlisted | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":285,"author":{"gitId":"ys112"},"content":"| HR Recruiter | add tags to contacts to specify which roles they are applying for | I can keep them organized | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":286,"author":{"gitId":"ys112"},"content":"| HR personnel | add notes or comments to individual contact entries | I can keep track of important additional information/interactions | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":287,"author":{"gitId":"ys112"},"content":"| experienced HR professional | filter and identify candidates by tags | I can follow up with them promptly | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":288,"author":{"gitId":"ys112"},"content":"| User | search through my contacts based on specific criteria | I can quickly find any information I need | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":289,"author":{"gitId":"ys112"},"content":"| HR Recruiter | extract contacts into a separate address book | I can import them to the company database easily | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":290,"author":{"gitId":"ys112"},"content":"| HR Recruiter | upload images to set profile pictures for my contacts | I can identify them when face to face | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":291,"author":{"gitId":"ys112"},"content":"| first-time user | have an intuitive experience and can quickly understand its features and functionalities | I can start using it effectively without wasting time | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":292,"author":{"gitId":"ys112"},"content":"| first-time user | can find clear instructions on how to use HRConnect | I can easily start managing my contacts using HRConnect | Typical |","lastModifiedDate":"2024-02-26"},{"lineNumber":293,"author":{"gitId":"ys112"},"content":"| HR Recruiter | Create new contacts with templates based on person (employees, intern, interviewee etc.) | | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":294,"author":{"gitId":"ys112"},"content":"| long-time user | create shortcuts for tasks | I can save time on frequenty used functions | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":295,"author":{"gitId":"ys112"},"content":"| User | receive notifications or reminders from HRConnect | I can be kept up to date with upcoming interviews, deadlines or follow-up tasks | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":296,"author":{"gitId":"ys112"},"content":"| User | can conduct background checks on potential hires directly within HRConnect | I can find out the suitability of a candidate easily | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":297,"author":{"gitId":"ys112"},"content":"| first-time user | easily import my data | it won\u0027t be intimidating and I won\u0027t give up on using it after my first use | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":298,"author":{"gitId":"ys112"},"content":"| HR personnel | sync any information changes across different devices | I can update information efficiently and ensure that all data is up to date for my coworkers as well | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":299,"author":{"gitId":"ys112"},"content":"| long-time user. | archive/hide unused contacts | I am not distracted by irrelevant data | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":300,"author":{"gitId":"ys112"},"content":"| HR Recruiter | create custom automated processes for repetitive tasks | I can save time on such tasks | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":301,"author":{"gitId":"ys112"},"content":"| potential user exploring the app | see the app populated with sample data | I can easily see the benefits of the app when frequently used | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":302,"author":{"gitId":"ys112"},"content":"| HR personnel | keep track of the status of job applications or recruitment processes for each candidate | I can monitor progress and follow up as needed | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":303,"author":{"gitId":"ys112"},"content":"| User | track the status of each potential hire in the recruitment process | I can take action as needed | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":304,"author":{"gitId":"ys112"},"content":"| User | conduct surveys and collect feedback from specific groups within my contacts | I can easily conduct surveys as needed | Novel |","lastModifiedDate":"2024-02-26"},{"lineNumber":305,"author":{"gitId":"ys112"},"content":"| first-time user | access a brief tutorial on how to navigate HRConnect | I can quickly familiarize myself with its features and functions | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":306,"author":{"gitId":"ys112"},"content":"| User | generate reports or analytics on hiring activities such as time-to-fill metrics, source of hire, and diversity statistics | I can easily access such information as needed | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":307,"author":{"gitId":"ys112"},"content":"| User | integrate HRConnect with other HR systems or tools such as applicant tracking systems or payroll software | data exchange and workflows can be streamlined | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":308,"author":{"gitId":"ys112"},"content":"| User | schedule and conduct virtual interviews directly within HRConnect, including video conferencing and interview notes | | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":309,"author":{"gitId":"ys112"},"content":"| User | track and manage employee referrals and incentives programs within HRConnect, including tracking referral bonuses and monitoring the effectiveness of referral campaigns | | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":310,"author":{"gitId":"ys112"},"content":"| User | generate customizable offer letters and employment contracts directly within HRConnect, including integrating e-signature solutions | I can perform these tasks more efficiently | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":311,"author":{"gitId":"ys112"},"content":"| User | create and manage employee development plans with HRConnect | | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":312,"author":{"gitId":"ys112"},"content":"| User | create and manage succession plans with HRConnect, including identifying high-potential employees, mapping career paths and planning for leadership transitions | | Out of scope |","lastModifiedDate":"2024-02-26"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"xinen26"},"content":"(For all use cases below, the **System** is the `HRConnect` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-02-27"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":319,"author":{"gitId":"xinen26"},"content":"**Use case: Add a contact**","lastModifiedDate":"2024-02-27"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":321,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":322,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":323,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":324,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":325,"author":{"gitId":"xinen26"},"content":"3. User requests to add a specific contact to the list","lastModifiedDate":"2024-02-27"},{"lineNumber":326,"author":{"gitId":"xinen26"},"content":"4. HRConnect adds the contact","lastModifiedDate":"2024-02-27"},{"lineNumber":327,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":328,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":329,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":330,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":332,"author":{"gitId":"xinen26"},"content":"* 3a. The given format is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":334,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":335,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":336,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":337,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":338,"author":{"gitId":"xinen26"},"content":"* 3b. The contact details have been added before.","lastModifiedDate":"2024-02-27"},{"lineNumber":339,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":340,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":341,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":342,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":343,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":344,"author":{"gitId":"xinen26"},"content":"**Use case: Clear**","lastModifiedDate":"2024-02-27"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":346,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":348,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":349,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":350,"author":{"gitId":"xinen26"},"content":"3. User requests to clear the list","lastModifiedDate":"2024-02-27"},{"lineNumber":351,"author":{"gitId":"xinen26"},"content":"4. HRConnect deletes all entries in list","lastModifiedDate":"2024-02-27"},{"lineNumber":352,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":353,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":354,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":355,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":356,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":357,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":358,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":359,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":360,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":361,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":362,"author":{"gitId":"xinen26"},"content":"**Use case: Add comment to contact**","lastModifiedDate":"2024-02-27"},{"lineNumber":363,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":364,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":365,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":366,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":367,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":368,"author":{"gitId":"xinen26"},"content":"3. User requests to add a comment to a specific person in the list","lastModifiedDate":"2024-02-27"},{"lineNumber":369,"author":{"gitId":"xinen26"},"content":"4. HRConnect adds comment to the person","lastModifiedDate":"2024-02-27"},{"lineNumber":370,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":371,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":372,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":373,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":374,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":375,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":376,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":377,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":378,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":379,"author":{"gitId":"xinen26"},"content":"* 3a. The given Application ID is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":380,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":381,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":382,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":383,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":384,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":385,"author":{"gitId":"xinen26"},"content":"* 3b. The comment is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":386,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":387,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":388,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":389,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":390,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":391,"author":{"gitId":"xinen26"},"content":"* 3c. The comment is a duplicate of a previous comment assigned to the same contact.","lastModifiedDate":"2024-02-27"},{"lineNumber":392,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":393,"author":{"gitId":"xinen26"},"content":" * 3c1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":394,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":395,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":396,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"xinen26"},"content":"**Use case: Delete a contact**","lastModifiedDate":"2024-02-27"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":403,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":404,"author":{"gitId":"xinen26"},"content":"3. User requests to delete a specific contact on the list","lastModifiedDate":"2024-02-27"},{"lineNumber":405,"author":{"gitId":"xinen26"},"content":"4. HRConnect deletes the person","lastModifiedDate":"2024-02-27"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":422,"author":{"gitId":"xinen26"},"content":"**Use case: Edit a person**","lastModifiedDate":"2024-02-27"},{"lineNumber":423,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":424,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":425,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":426,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":427,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":428,"author":{"gitId":"xinen26"},"content":"3. User requests to edit a specific person\u0027s details in the list","lastModifiedDate":"2024-02-27"},{"lineNumber":429,"author":{"gitId":"xinen26"},"content":"4. HRConnect edits the details belonging to the person","lastModifiedDate":"2024-02-27"},{"lineNumber":430,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":431,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":432,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":433,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":434,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":435,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":436,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":437,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":438,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":439,"author":{"gitId":"xinen26"},"content":"* 3a. The given index of the person is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":440,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":441,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":443,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":445,"author":{"gitId":"xinen26"},"content":"* 3b. The given format of the command is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":446,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":447,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":448,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":449,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":450,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":451,"author":{"gitId":"xinen26"},"content":"**Use case: Export contacts**","lastModifiedDate":"2024-02-27"},{"lineNumber":452,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":453,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":454,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":455,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":456,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":457,"author":{"gitId":"xinen26"},"content":"3. User requests to export contacts into a separate address book section.","lastModifiedDate":"2024-02-27"},{"lineNumber":458,"author":{"gitId":"xinen26"},"content":"4. HRConnect exports the specified range of contacts to the designated page.","lastModifiedDate":"2024-02-27"},{"lineNumber":459,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":460,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":461,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":462,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":463,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":464,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":465,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":466,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":467,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":468,"author":{"gitId":"xinen26"},"content":"* 3a. The given format of the command is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":469,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":470,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":471,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":472,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":473,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":474,"author":{"gitId":"xinen26"},"content":"* 3b. The given range is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":475,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":476,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":477,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":478,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":479,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":480,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":481,"author":{"gitId":"xinen26"},"content":"**Use case: Filter Tag**","lastModifiedDate":"2024-02-27"},{"lineNumber":482,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":483,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":484,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":485,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":486,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":487,"author":{"gitId":"xinen26"},"content":"3. User requests to filter through the contact list based on what stage the interviewee is in","lastModifiedDate":"2024-02-27"},{"lineNumber":488,"author":{"gitId":"xinen26"},"content":"4. HRConnect returns entries only for interviewees in that particular stage. ","lastModifiedDate":"2024-02-27"},{"lineNumber":489,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":490,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":491,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":492,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":493,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":494,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":495,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":496,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":497,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":498,"author":{"gitId":"xinen26"},"content":"* 3a. The given format of the command is invalid.","lastModifiedDate":"2024-02-27"},{"lineNumber":499,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":500,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":501,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":502,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":503,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":504,"author":{"gitId":"xinen26"},"content":"* 3b. The tag does not exist.","lastModifiedDate":"2024-02-27"},{"lineNumber":505,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":506,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":507,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":508,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":509,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":510,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":511,"author":{"gitId":"xinen26"},"content":"**Use case: Find keyword**","lastModifiedDate":"2024-02-27"},{"lineNumber":512,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":513,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":514,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":515,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":516,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":517,"author":{"gitId":"xinen26"},"content":"3. User requests to find entries that match the keyword in the list","lastModifiedDate":"2024-02-27"},{"lineNumber":518,"author":{"gitId":"xinen26"},"content":"4. HRConnect returns entries that match the keyword","lastModifiedDate":"2024-02-27"},{"lineNumber":519,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":520,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":521,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":522,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":523,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":524,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":525,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":526,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":527,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":528,"author":{"gitId":"xinen26"},"content":"**Use case: List**","lastModifiedDate":"2024-02-27"},{"lineNumber":529,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":530,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":531,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":532,"author":{"gitId":"xinen26"},"content":"1. User requests to list persons","lastModifiedDate":"2024-02-27"},{"lineNumber":533,"author":{"gitId":"xinen26"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-02-27"},{"lineNumber":534,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":535,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":536,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":537,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":538,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":539,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":540,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":541,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":542,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":543,"author":{"gitId":"xinen26"},"content":"**Use case: Add tag**","lastModifiedDate":"2024-02-27"},{"lineNumber":544,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":545,"author":{"gitId":"xinen26"},"content":"**MSS**","lastModifiedDate":"2024-02-27"},{"lineNumber":546,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":547,"author":{"gitId":"xinen26"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":548,"author":{"gitId":"xinen26"},"content":"2. HRConnect shows a list of contacts","lastModifiedDate":"2024-02-27"},{"lineNumber":549,"author":{"gitId":"xinen26"},"content":"3. User requests to add specific tags to specific contacts for easy filtering later.","lastModifiedDate":"2024-02-27"},{"lineNumber":550,"author":{"gitId":"xinen26"},"content":"4. HRConnect adds the specified tag to the designated contact.","lastModifiedDate":"2024-02-27"},{"lineNumber":551,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":552,"author":{"gitId":"xinen26"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":553,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":554,"author":{"gitId":"xinen26"},"content":"**Extensions**","lastModifiedDate":"2024-02-27"},{"lineNumber":555,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":556,"author":{"gitId":"xinen26"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":557,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":558,"author":{"gitId":"xinen26"},"content":"* 3a. The application ID does not exist.","lastModifiedDate":"2024-02-27"},{"lineNumber":559,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":560,"author":{"gitId":"xinen26"},"content":" * 3a1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":561,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":562,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":563,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":564,"author":{"gitId":"xinen26"},"content":"* 3b. The tag does not exist.","lastModifiedDate":"2024-02-27"},{"lineNumber":565,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":566,"author":{"gitId":"xinen26"},"content":" * 3b1. HRConnect shows an error message.","lastModifiedDate":"2024-02-27"},{"lineNumber":567,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":568,"author":{"gitId":"xinen26"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-27"},{"lineNumber":569,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":570,"author":{"gitId":"xinen26"},"content":" Use case ends","lastModifiedDate":"2024-02-27"},{"lineNumber":571,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":572,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":573,"author":{"gitId":"xinen26"},"content":" ","lastModifiedDate":"2024-02-27"},{"lineNumber":574,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":575,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"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":578,"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":579,"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":580,"author":{"gitId":"YuvBindal"},"content":"4. Searches, additions, and updates to contacts should be processed within 2 seconds under normal operational conditions.","lastModifiedDate":"2024-03-04"},{"lineNumber":581,"author":{"gitId":"YuvBindal"},"content":"5. HRConnect should feature an intuitive user interface for easy management of contacts without prior training.","lastModifiedDate":"2024-03-04"},{"lineNumber":582,"author":{"gitId":"YuvBindal"},"content":"6. The system should provide clear error messages and guidance for correcting invalid inputs.","lastModifiedDate":"2024-03-04"},{"lineNumber":583,"author":{"gitId":"YuvBindal"},"content":"7. User data, including contacts, notes, and tags, must be securely handled both in transit and at rest.","lastModifiedDate":"2024-03-04"},{"lineNumber":584,"author":{"gitId":"YuvBindal"},"content":"8. The system should be designed to scale horizontally to accommodate growing numbers of users and contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":585,"author":{"gitId":"YuvBindal"},"content":"9. It should maintain performance and usability as data volume and number of concurrent users increase.","lastModifiedDate":"2024-03-04"},{"lineNumber":586,"author":{"gitId":"YuvBindal"},"content":"10. HRConnect should be available 24/7 with a target uptime of 99.9%, excluding scheduled maintenance.","lastModifiedDate":"2024-03-04"},{"lineNumber":587,"author":{"gitId":"YuvBindal"},"content":"11. It should include mechanisms for data backup and recovery to prevent data loss.","lastModifiedDate":"2024-03-04"},{"lineNumber":588,"author":{"gitId":"YuvBindal"},"content":"12. The system should be compatible with major operating systems (Windows, macOS, Linux) and browsers (Chrome, Firefox, Safari).","lastModifiedDate":"2024-03-04"},{"lineNumber":589,"author":{"gitId":"YuvBindal"},"content":"13. The application should be built using modular, well-documented code to facilitate maintenance and future updates.","lastModifiedDate":"2024-03-04"},{"lineNumber":590,"author":{"gitId":"YuvBindal"},"content":"14. It should allow for the easy addition of new features without significant restructuring of the existing codebase.","lastModifiedDate":"2024-03-04"},{"lineNumber":591,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":592,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":593,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":594,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":595,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":596,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":597,"author":{"gitId":"ChrisHo1341"},"content":"* **Time-to-fill**: The time taken to find and hire a new candidate","lastModifiedDate":"2024-03-07"},{"lineNumber":598,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":599,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":600,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":601,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":602,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":603,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":604,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":605,"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":606,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":607,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":608,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":609,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":610,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":611,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":612,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":613,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":614,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":615,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":616,"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":617,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":618,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":619,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":620,"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":621,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":622,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":623,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":624,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":625,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":626,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":627,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":628,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":629,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":630,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":631,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":632,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":633,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":634,"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":635,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":636,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":637,"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":638,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":639,"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":640,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":641,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":642,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":643,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":644,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":645,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":646,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":647,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":648,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":649,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":650,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"YuvBindal":11,"ys112":47,"xinen26":229,"-":362,"ChrisHo1341":1}},{"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":"ys112"},"content":"**HRConnect is a Command Line Interface (CLI) optimized desktop application designed for storing contacts of potential hires, hiring agencies, and legal consultants.**","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"ys112"},"content":"By using commands, HR officers can efficiently organize contacts for their recruiting process.","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"{:toc}","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"ys112"},"content":"1. Download the latest `hrconnect.jar` from [here](https://github.com/AY2324S2-CS2103-F15-3/tp/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"ys112"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"ys112"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar hrconnect.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"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":24,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"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":27,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"ys112"},"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 HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"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":"lihaoquan"},"content":"* When users input a command along with its arguments, it will be trimmed (remove leading whitespace, trailing whitespace, and whitespace in between words when there are more than one space) and converted to lowercase for parsing.","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"lihaoquan"},"content":"* When parsing arguments: “John Doe “, “John Doe”, and “ John Doe” will all be converted to “john doe”.","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"lihaoquan"},"content":"* When parsing commands: “/FILTER”, “/FILTER stage_one ”, “ /FILTER STAGE_ONE ” will all be converted to “/filter stage_one”.","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"lihaoquan"},"content":"* Words in angle brackets `\u003c\u003e` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"lihaoquan"},"content":" e.g. in `/filter \u003cTag\u003e`, `\u003cTag\u003e` is a parameter which can be used as `/filter initial_application`.","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"lihaoquan"},"content":"* Parameters can be in any order for `add` and `edit` commands.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"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":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"lihaoquan"},"content":"* Parameters must be in strict order for `filter`, `comment`, `export`, and `tag` command.","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"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":67,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":69,"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":70,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"ys112"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-02-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"ys112"},"content":"### Add an interviewee: `add`","lastModifiedDate":"2024-02-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"ys112"},"content":"Adds an interviewee to the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"ys112"},"content":"Format: `add /n Name /p Phone_Number e/Email a/Address [/t Tag]…​`","lastModifiedDate":"2024-02-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"ys112"},"content":"A interviewee can have any number of tags (including 0)","lastModifiedDate":"2024-02-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"ys112"},"content":"* `add /n John Doe /p 98765432 /e johnDoegmail.com /a John street, block 123, #01-01 /t friend`","lastModifiedDate":"2024-02-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"ys112"},"content":"### Listing all interviewees : `list`","lastModifiedDate":"2024-02-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"ys112"},"content":"Shows a list of all persons in the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"ys112"},"content":"### Editing an interviewee : `edit`","lastModifiedDate":"2024-02-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"ys112"},"content":"Edits an existing interviewee in the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"ys112"},"content":"Format: `edit Index [/n Name] [/p Phone] [/e Email] [/a Address] [/t Tag]…​`","lastModifiedDate":"2024-02-26"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"ys112"},"content":"* Edits the interviewee at the specified `Index`. The index refers to the index number shown in the displayed interviewee list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-26"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"ys112"},"content":"* When editing tags, the existing tags of the interviewee will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-02-26"},{"lineNumber":107,"author":{"gitId":"ys112"},"content":"* You can remove all the interviewee’s tags by typing `/t` without","lastModifiedDate":"2024-02-26"},{"lineNumber":108,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"ys112"},"content":"* `edit 1 /n 91234567 /e johndoe@example.com` Edits the phone number and email address of the 1st interviewee to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-02-26"},{"lineNumber":112,"author":{"gitId":"ys112"},"content":"* `edit 2 /n Betsy Crower /t` Edits the name of the 2nd interviewee to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-02-26"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"ys112"},"content":"### Locating interviewees by name: `find`","lastModifiedDate":"2024-02-26"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"ys112"},"content":"Format: `find Keyword [More_Keywords]`","lastModifiedDate":"2024-02-26"},{"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":"ys112"},"content":"### Deleting an interviewee : `delete`","lastModifiedDate":"2024-02-26"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"ys112"},"content":"Deletes the specified interviewee from the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"ys112"},"content":"Format: `delete Index`","lastModifiedDate":"2024-02-26"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"ys112"},"content":"* Deletes the interviewee at the specified `Index`.","lastModifiedDate":"2024-02-26"},{"lineNumber":139,"author":{"gitId":"ys112"},"content":"* The index refers to the index number shown in the displayed interviewee list.","lastModifiedDate":"2024-02-26"},{"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":"ys112"},"content":"* `list` followed by `delete 2` deletes the 2nd interviewee in the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":144,"author":{"gitId":"ys112"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st interviewee in the results of the `find` command.","lastModifiedDate":"2024-02-26"},{"lineNumber":145,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":146,"author":{"gitId":"ChrisHo1341"},"content":"### Adding tags to interviewees: `/tag`","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":148,"author":{"gitId":"ChrisHo1341"},"content":"Attaches specific tags to interviewees for easy filtering later","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"ChrisHo1341"},"content":"Format: `/tag \u003cApplicationID\u003e \u003cTag\u003e`","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"ChrisHo1341"},"content":"* Maps `\u003cTag\u003e` to the `\u003cApplicationID\u003e`","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"ChrisHo1341"},"content":"* `ApplicationID` must be a valid ID currently saved in HRConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"ChrisHo1341"},"content":"Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"ChrisHo1341"},"content":"* `/tag 123456 \u003cinitial_application\u003e` maps the tag `\u003cinitial_application\u003e` to applicant 123456","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"ChrisHo1341"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"ys112"},"content":"### Filtering interviewees by tag : `/filter`","lastModifiedDate":"2024-02-26"},{"lineNumber":159,"author":{"gitId":"ys112"},"content":"Filter through contact list based on what stage the interviewee is in.","lastModifiedDate":"2024-02-26"},{"lineNumber":160,"author":{"gitId":"ys112"},"content":"Format: `/filter \u003cTag\u003e`","lastModifiedDate":"2024-02-26"},{"lineNumber":161,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":162,"author":{"gitId":"ys112"},"content":"* Filters the contact list based on the `\u003cTag\u003e` provided.","lastModifiedDate":"2024-02-26"},{"lineNumber":163,"author":{"gitId":"ys112"},"content":"* Possible values for `\u003cTag\u003e` are `initial_application`, `technical_assessment`, `interview`, `decision_and_offer`.","lastModifiedDate":"2024-02-26"},{"lineNumber":164,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":165,"author":{"gitId":"ys112"},"content":"Examples:","lastModifiedDate":"2024-02-26"},{"lineNumber":166,"author":{"gitId":"ys112"},"content":"* `/filter initial_application` filters the contact list to show only interviewees in the initial application stage.","lastModifiedDate":"2024-02-26"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"xinen26"},"content":"### Adding notes to interviewees by tag : `/comment`","lastModifiedDate":"2024-02-27"},{"lineNumber":169,"author":{"gitId":"xinen26"},"content":"Facilitates the addition of notes or comments to individual interviewee entries.","lastModifiedDate":"2024-02-27"},{"lineNumber":170,"author":{"gitId":"xinen26"},"content":"Format: `/comment \u003cApplicationId\u003e \u003cNote\u003e`","lastModifiedDate":"2024-02-27"},{"lineNumber":171,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":172,"author":{"gitId":"xinen26"},"content":"* Incorporate supplementary notes to enrich the interviewee\u0027s profile.","lastModifiedDate":"2024-02-27"},{"lineNumber":173,"author":{"gitId":"xinen26"},"content":"* Possible values for `\u003cApplicationId\u003e` are integers.","lastModifiedDate":"2024-02-27"},{"lineNumber":174,"author":{"gitId":"xinen26"},"content":"* Possible values for `\u003cNote\u003e` are any non-empty string that provides relevant commentary.","lastModifiedDate":"2024-02-27"},{"lineNumber":175,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":176,"author":{"gitId":"xinen26"},"content":"Examples:","lastModifiedDate":"2024-02-27"},{"lineNumber":177,"author":{"gitId":"xinen26"},"content":"* `/comment 10 “S/Pass Holder”` will add the note “S/Pass Holder” to the applicant identified by ID 10.","lastModifiedDate":"2024-02-27"},{"lineNumber":178,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":179,"author":{"gitId":"YuvBindal"},"content":"### Exporting interviewees contacts by pageId : `/export`","lastModifiedDate":"2024-03-04"},{"lineNumber":180,"author":{"gitId":"ys112"},"content":"Extracts interviewees contacts into a separate HRConnect identified by a pageId","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"YuvBindal"},"content":"Format: /export \u003cContactRange\u003e \u003cpageId\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":182,"author":{"gitId":"YuvBindal"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":183,"author":{"gitId":"YuvBindal"},"content":"* Achieve an additional layer of organisation to properly arrange contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":184,"author":{"gitId":"YuvBindal"},"content":"* Possible values for `\u003cpageId\u003e` are integers.","lastModifiedDate":"2024-03-04"},{"lineNumber":185,"author":{"gitId":"YuvBindal"},"content":"* Possible values for ContactRange are two integers denoting start:end indices.","lastModifiedDate":"2024-03-04"},{"lineNumber":186,"author":{"gitId":"YuvBindal"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":187,"author":{"gitId":"YuvBindal"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":188,"author":{"gitId":"YuvBindal"},"content":"* `/export [0:10] 1` will append contacts 0 to 10 inclusive onto page identified by ID 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":189,"author":{"gitId":"YuvBindal"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"ys112"},"content":"Clears all entries from the HRConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"ys112"},"content":"HRConnect 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-06"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":208,"author":{"gitId":"ys112"},"content":"HRConnect data are saved automatically as a JSON file `[JAR file location]/data/hrconnect.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-06"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":211,"author":{"gitId":"ys112"},"content":"If your changes to the data file makes its format invalid, HRConnect 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-06"},{"lineNumber":212,"author":{"gitId":"ys112"},"content":"Furthermore, certain edits can cause the HRConnect 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-06"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":217,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"ys112"},"content":"**Add** | `add /n Name /p Phone_Number e/Email a/Address [/t Tag]…​`\u003cbr\u003e e.g., `add /n John Doe /p 98765432 /e johnDoe@gmail.com /a John street, block 123, #01-01 /t friend`","lastModifiedDate":"2024-02-26"},{"lineNumber":222,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"ys112"},"content":"**Edit** | `edit Index [/n Name] [/p Phone] [/e Email] [/a Address] [/t Tag]…​`\u003cbr\u003e e.g., `edit 2 /n Betsy Crower /t friend`","lastModifiedDate":"2024-02-26"},{"lineNumber":225,"author":{"gitId":"ys112"},"content":"**Find** | `find Keyword [More_Keywords]`\u003cbr\u003e e.g., `find alice bob charlie`","lastModifiedDate":"2024-02-26"},{"lineNumber":226,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"ys112"},"content":"**Exit** | `exit`","lastModifiedDate":"2024-02-26"},{"lineNumber":229,"author":{"gitId":"ys112"},"content":"**Filter** | `/filter \u003cTag\u003e` \u003cbr\u003e e.g., `/filter initial_application`","lastModifiedDate":"2024-02-26"},{"lineNumber":230,"author":{"gitId":"xinen26"},"content":"**Comment** | `/comment \u003cApplicationId\u003e \u003cNote\u003e` \u003cbr\u003e e.g., `/comment 10 “S/Pass Holder”`","lastModifiedDate":"2024-02-27"},{"lineNumber":231,"author":{"gitId":"YuvBindal"},"content":"**Export** | `/export \u003cContactRange\u003e \u003cpageId\u003e` \u003cbr\u003e e.g., `/export [0:10] 1`","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"lihaoquan":11,"YuvBindal":11,"ys112":52,"xinen26":12,"-":133,"ChrisHo1341":12}},{"path":"docs/team/lihaoquan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"lihaoquan"},"content":"---","lastModifiedDate":"2024-02-26"},{"lineNumber":2,"author":{"gitId":"lihaoquan"},"content":"layout: page","lastModifiedDate":"2024-02-26"},{"lineNumber":3,"author":{"gitId":"lihaoquan"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-26"},{"lineNumber":4,"author":{"gitId":"lihaoquan"},"content":"---","lastModifiedDate":"2024-02-26"},{"lineNumber":5,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":6,"author":{"gitId":"lihaoquan"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":9,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"lihaoquan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"lihaoquan"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":14,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":15,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":16,"author":{"gitId":"lihaoquan"},"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-02-26"},{"lineNumber":17,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"lihaoquan"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"lihaoquan"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"lihaoquan"},"content":"* **Project management**:","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"lihaoquan"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-26"},{"lineNumber":24,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"lihaoquan"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"lihaoquan"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-26"},{"lineNumber":27,"author":{"gitId":"lihaoquan"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":29,"author":{"gitId":"lihaoquan"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-26"},{"lineNumber":30,"author":{"gitId":"lihaoquan"},"content":" * User Guide:","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"lihaoquan"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"lihaoquan"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"lihaoquan"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"lihaoquan"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":36,"author":{"gitId":"lihaoquan"},"content":"* **Community**:","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"lihaoquan"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"lihaoquan"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-26"},{"lineNumber":39,"author":{"gitId":"lihaoquan"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"lihaoquan"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":42,"author":{"gitId":"lihaoquan"},"content":"* **Tools**:","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"lihaoquan"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"lihaoquan"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"lihaoquan"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"lihaoquan"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"lihaoquan":46}}] diff --git a/AY2324S2-CS2103-F15-3_tp_master/commits.json b/AY2324S2-CS2103-F15-3_tp_master/commits.json index 9417de88..719bf063 100644 --- a/AY2324S2-CS2103-F15-3_tp_master/commits.json +++ b/AY2324S2-CS2103-F15-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"lihaoquan":[{"date":"2024-02-26","commitResults":[{"hash":"485ac0c4113bf20d43f0fca4ff662b8aba5b3ee2","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Add information for v1.1 milestone\n\nUpdate AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":212,"deletions":27}}},{"hash":"6c664a71e6c4b72120c5e6a7a16cc1605d28515f","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1ec5d5d6d8af6d120888c7757c72f39a8c1b429e","isMergeCommit":true,"messageTitle":"Merge pull request #7 from lihaoquan/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"bf5316242a1401fdb2ec816b420c97a5437279d3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"56ff13c87311150d1af07425c78ee56ed2a382ae","isMergeCommit":false,"messageTitle":"Update product description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}},{"hash":"e86191d0624fe932970c2a8f640367ff49617af4","isMergeCommit":false,"messageTitle":"Update product description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":4}}},{"hash":"1626bfbc53b5591addf9d9807b6b36876fb8e5e5","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}},{"hash":"06394c043c03d51d5de5d0614be6300926ce7852","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-project-website\u0027 into branch-project-website","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f9044080cec6a83c2baa9bae1cb4eb49d3b43116","isMergeCommit":false,"messageTitle":"Fix trailing white-space for MarkDown","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"66bdc2b5851941971355fc43f2099f30ce10ae1c","isMergeCommit":false,"messageTitle":"Update AboutUs.md to comply with format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"ad8adf7170fb1b87401d88eb0f6fdd8ee777f38b","isMergeCommit":true,"messageTitle":"Merge pull request #8 from lihaoquan/branch-project-website","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-28","commitResults":[{"hash":"31337eed46eabd4d571c1be687d11b596f490a20","isMergeCommit":true,"messageTitle":"Merge pull request #14 from lihaoquan/branch-project-website","messageBody":"Update _config.yml","fileTypesAndContributionMap":{}},{"hash":"1d7af863793c8e6fd88c63355890d4ea96b4bf21","isMergeCommit":true,"messageTitle":"Merge pull request #15 from AY2324S2-CS2103-F15-3/branch-project-website","messageBody":"Merge Branch project website","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"ec78385a1e0fa488881d90dc6fac3e5202aaa88c","isMergeCommit":true,"messageTitle":"Merge pull request #16 from lihaoquan/branch-project-website","messageBody":"Update Ui.png","fileTypesAndContributionMap":{}},{"hash":"1306441f5fa982963694dbdc7be8b005cb8e8db3","isMergeCommit":true,"messageTitle":"Merge pull request #17 from AY2324S2-CS2103-F15-3/branch-project-website","messageBody":"Update Ui.png","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"0b48fcbadfe6801e2ded7e5ec09c52ae659ee192","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":6}}},{"hash":"7d9f0180b535d9795338072cdf98e06ea18a2b82","isMergeCommit":true,"messageTitle":"Merge pull request #21 from lihaoquan/branch-project-website","messageBody":"Update UserGuide.md for \"In General / Features\"","fileTypesAndContributionMap":{}},{"hash":"15556c623b136885ca384b70ac8d3df6c0191942","isMergeCommit":true,"messageTitle":"Merge pull request #22 from AY2324S2-CS2103-F15-3/branch-project-website","messageBody":"Merge Branch project website ","fileTypesAndContributionMap":{}},{"hash":"3b44f1591abb3cffc48fd640b2b398109f5313fb","isMergeCommit":false,"messageTitle":"Remove extra bullet point","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f4f3afc19a99b338670bd339e844d898b2326ff4","isMergeCommit":true,"messageTitle":"Merge pull request #23 from lihaoquan/branch-project-website","messageBody":"Remove extra bullet point for UserGuide.md","fileTypesAndContributionMap":{}}]}],"YuvBindal":[{"date":"2024-02-26","commitResults":[{"hash":"cad3283eb64ab9924b482ec1eb972b333e8cc7b7","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"17893fbc0e06f7de60a7b11fd99cc713f9c2dc28","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"9472907511f9aa2ba2b2fe7f5ba35362d152d794","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":0}}},{"hash":"e9df6f839cf980bf531134d1589c60a624dfeb38","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"d2d5784ef9d3ab7816c67bc57b3c3463dc2f6242","isMergeCommit":true,"messageTitle":"Merge pull request #18 from YuvBindal/master","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"eb97cc9ce66282a7301f1e60d6aca0f268421bca","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":1}}},{"hash":"7771e618340605e2fbf1c91abaa88f3a7d4f3413","isMergeCommit":true,"messageTitle":"Merge pull request #19 from YuvBindal/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"ys112":[{"date":"2024-02-26","commitResults":[{"hash":"cf39008a185c1b65e8f5fcd91acc41645e556235","isMergeCommit":false,"messageTitle":"Add filter feature into user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":39,"deletions":48}}},{"hash":"e428f29178e1f9be3b504bcd6fe0ac0b95826030","isMergeCommit":false,"messageTitle":"Fix checkstyle issues for guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"80f9104113349f551c4cd0d1b24cc4eb90919ee4","isMergeCommit":true,"messageTitle":"Merge pull request #10 from ys112/update-UG","messageBody":"Add filter feature into user guide","fileTypesAndContributionMap":{}},{"hash":"aafe1cd941fd4c30a1e367fe27290b3a71accfa5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-project-website","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a5b8585298d96f0dfb928979d558c025e1b69a57","isMergeCommit":true,"messageTitle":"Merge pull request #9 from AY2324S2-CS2103-F15-3/branch-project-website","messageBody":"Merge Branch project website","fileTypesAndContributionMap":{}},{"hash":"1868195dbfc4c08505d8d20ba1b4529cb8385b52","isMergeCommit":false,"messageTitle":"Add target user profile, value proposition, and user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":47,"deletions":21}}},{"hash":"8f53d0087a6121d02bf018c2aa4fda706f805c92","isMergeCommit":true,"messageTitle":"Merge pull request #11 from ys112/update-DG","messageBody":"Add target user profile, value proposition, and user stories","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"29ff1bc75eda17631acf0f4fcd613ed418cda960","isMergeCommit":false,"messageTitle":"Clean up traces of AB3 in user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"225fd34ab68ba2f6deb209cfc900fbc33054f2b2","isMergeCommit":true,"messageTitle":"Merge pull request #20 from ys112/update-UG","messageBody":"Clean up traces of AB3 in user guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"d528149df7745dd73f52c7af02fc9a7bb9bb7bd4","isMergeCommit":false,"messageTitle":"Clean up user guide for HRConnect","messageBody":"Change related names in user guide like addressbook.jar to\nhrconnect.jar for relevance.\n\nWill have to make changes in code and gradle build to reflect the\nrefactor of name to HRConnect.\n","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"ec653a26065569b1147d3f1a1c0401e2030aa684","isMergeCommit":false,"messageTitle":"Clean up any mentions of address book related words to HRConnect","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}},{"hash":"aff3dc51f9fab075ca145ffb8e5b53b911d278e2","isMergeCommit":true,"messageTitle":"Merge pull request #24 from ys112/update-UG","messageBody":"Clean up user guide for HRConnect","fileTypesAndContributionMap":{}}]}],"xinen26":[{"date":"2024-02-27","commitResults":[{"hash":"e719870711d0cf4277bad8363f4c0c3f3eb371ff","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":0}}},{"hash":"d21645e77f9bf150bb382400ba992af001fbd894","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"daec8e73f3b0687ad3fa13de2e5e58d16bbeca3d","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"6132eba6bcb853aadcd0cad6a98341704e4a2140","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"0f27c787414747a2f33e77f55537a1e7797f2c5a","isMergeCommit":true,"messageTitle":"Merge pull request #12 from xinen26/Update-UG","messageBody":"Add Comment function into user guide","fileTypesAndContributionMap":{}},{"hash":"3188f83f6eff5a9a308eeea6c43c1d60c1831e49","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":84,"deletions":3}}},{"hash":"d2767249122c205d57f7dbe1e55732ef50618d01","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":154,"deletions":0}}},{"hash":"8adc30cdaf1644a32eddaf0cb1524619d35b7ab4","isMergeCommit":false,"messageTitle":"Change names for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":50}}},{"hash":"608a70e29abbcfa9580fc25d5922b72751a18e15","isMergeCommit":true,"messageTitle":"Merge pull request #13 from xinen26/Update-DG","messageBody":"Update developer guide for use case","fileTypesAndContributionMap":{}}]}],"ChrisHo1341":[{"date":"2024-03-07","commitResults":[{"hash":"df8daef8eba8fa9bc8c9dcefa4f34c3cd70e5c30","isMergeCommit":false,"messageTitle":"Update DevGuide and UserGuide","messageBody":"Add tag function in user guide and glossary to devguide\n","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":0}}},{"hash":"55378a4f85d6281275ac2d7741e644f47a96184f","isMergeCommit":true,"messageTitle":"Merge pull request #27 from ChrisHo1341/CH-v1.1","messageBody":"Update DevGuide and UserGuide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"lihaoquan":{"docs":90,"functional-code":0,"test-code":0},"YuvBindal":{"docs":24,"functional-code":0,"test-code":0},"ys112":{"docs":99,"functional-code":0,"test-code":0},"xinen26":{"docs":241,"functional-code":0,"test-code":0},"ChrisHo1341":{"docs":13,"functional-code":0,"test-code":0}},"authorContributionVariance":{"lihaoquan":4771.2456,"YuvBindal":40.489796,"ys112":1724.4075,"xinen26":8643.742,"ChrisHo1341":11.209183},"authorDisplayNameMap":{"lihaoquan":"CS2103-F15-3 LI H..QUAN","YuvBindal":"CS2103-F15-3 BIND.. YUV","ys112":"CS2103-F15-3 YONG..SIAN","xinen26":"CS2103-F15-3 LEE ..N EN","ChrisHo1341":"CS2103-F15-3 HO W..PHER"}} +{"authorDailyContributionsMap":{"lihaoquan":[{"date":"2024-02-26","commitResults":[{"hash":"485ac0c4113bf20d43f0fca4ff662b8aba5b3ee2","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Add information for v1.1 milestone\n\nUpdate AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":212,"deletions":27}}},{"hash":"6c664a71e6c4b72120c5e6a7a16cc1605d28515f","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1ec5d5d6d8af6d120888c7757c72f39a8c1b429e","isMergeCommit":true,"messageTitle":"Merge pull request #7 from lihaoquan/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"bf5316242a1401fdb2ec816b420c97a5437279d3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"56ff13c87311150d1af07425c78ee56ed2a382ae","isMergeCommit":false,"messageTitle":"Update product description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}},{"hash":"e86191d0624fe932970c2a8f640367ff49617af4","isMergeCommit":false,"messageTitle":"Update product description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":4}}},{"hash":"1626bfbc53b5591addf9d9807b6b36876fb8e5e5","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}},{"hash":"06394c043c03d51d5de5d0614be6300926ce7852","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-project-website\u0027 into branch-project-website","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f9044080cec6a83c2baa9bae1cb4eb49d3b43116","isMergeCommit":false,"messageTitle":"Fix trailing white-space for MarkDown","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"66bdc2b5851941971355fc43f2099f30ce10ae1c","isMergeCommit":false,"messageTitle":"Update AboutUs.md to comply with format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"ad8adf7170fb1b87401d88eb0f6fdd8ee777f38b","isMergeCommit":true,"messageTitle":"Merge pull request #8 from lihaoquan/branch-project-website","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-28","commitResults":[{"hash":"31337eed46eabd4d571c1be687d11b596f490a20","isMergeCommit":true,"messageTitle":"Merge pull request #14 from lihaoquan/branch-project-website","messageBody":"Update _config.yml","fileTypesAndContributionMap":{}},{"hash":"1d7af863793c8e6fd88c63355890d4ea96b4bf21","isMergeCommit":true,"messageTitle":"Merge pull request #15 from AY2324S2-CS2103-F15-3/branch-project-website","messageBody":"Merge Branch project website","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"ec78385a1e0fa488881d90dc6fac3e5202aaa88c","isMergeCommit":true,"messageTitle":"Merge pull request #16 from lihaoquan/branch-project-website","messageBody":"Update Ui.png","fileTypesAndContributionMap":{}},{"hash":"1306441f5fa982963694dbdc7be8b005cb8e8db3","isMergeCommit":true,"messageTitle":"Merge pull request #17 from AY2324S2-CS2103-F15-3/branch-project-website","messageBody":"Update Ui.png","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"0b48fcbadfe6801e2ded7e5ec09c52ae659ee192","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":6}}},{"hash":"7d9f0180b535d9795338072cdf98e06ea18a2b82","isMergeCommit":true,"messageTitle":"Merge pull request #21 from lihaoquan/branch-project-website","messageBody":"Update UserGuide.md for \"In General / Features\"","fileTypesAndContributionMap":{}},{"hash":"15556c623b136885ca384b70ac8d3df6c0191942","isMergeCommit":true,"messageTitle":"Merge pull request #22 from AY2324S2-CS2103-F15-3/branch-project-website","messageBody":"Merge Branch project website ","fileTypesAndContributionMap":{}},{"hash":"3b44f1591abb3cffc48fd640b2b398109f5313fb","isMergeCommit":false,"messageTitle":"Remove extra bullet point","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f4f3afc19a99b338670bd339e844d898b2326ff4","isMergeCommit":true,"messageTitle":"Merge pull request #23 from lihaoquan/branch-project-website","messageBody":"Remove extra bullet point for UserGuide.md","fileTypesAndContributionMap":{}}]}],"YuvBindal":[{"date":"2024-02-26","commitResults":[{"hash":"cad3283eb64ab9924b482ec1eb972b333e8cc7b7","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"17893fbc0e06f7de60a7b11fd99cc713f9c2dc28","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"9472907511f9aa2ba2b2fe7f5ba35362d152d794","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":0}}},{"hash":"e9df6f839cf980bf531134d1589c60a624dfeb38","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"d2d5784ef9d3ab7816c67bc57b3c3463dc2f6242","isMergeCommit":true,"messageTitle":"Merge pull request #18 from YuvBindal/master","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"eb97cc9ce66282a7301f1e60d6aca0f268421bca","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":1}}},{"hash":"7771e618340605e2fbf1c91abaa88f3a7d4f3413","isMergeCommit":true,"messageTitle":"Merge pull request #19 from YuvBindal/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"ys112":[{"date":"2024-02-26","commitResults":[{"hash":"cf39008a185c1b65e8f5fcd91acc41645e556235","isMergeCommit":false,"messageTitle":"Add filter feature into user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":39,"deletions":48}}},{"hash":"e428f29178e1f9be3b504bcd6fe0ac0b95826030","isMergeCommit":false,"messageTitle":"Fix checkstyle issues for guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"80f9104113349f551c4cd0d1b24cc4eb90919ee4","isMergeCommit":true,"messageTitle":"Merge pull request #10 from ys112/update-UG","messageBody":"Add filter feature into user guide","fileTypesAndContributionMap":{}},{"hash":"aafe1cd941fd4c30a1e367fe27290b3a71accfa5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-project-website","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a5b8585298d96f0dfb928979d558c025e1b69a57","isMergeCommit":true,"messageTitle":"Merge pull request #9 from AY2324S2-CS2103-F15-3/branch-project-website","messageBody":"Merge Branch project website","fileTypesAndContributionMap":{}},{"hash":"1868195dbfc4c08505d8d20ba1b4529cb8385b52","isMergeCommit":false,"messageTitle":"Add target user profile, value proposition, and user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":47,"deletions":21}}},{"hash":"8f53d0087a6121d02bf018c2aa4fda706f805c92","isMergeCommit":true,"messageTitle":"Merge pull request #11 from ys112/update-DG","messageBody":"Add target user profile, value proposition, and user stories","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"29ff1bc75eda17631acf0f4fcd613ed418cda960","isMergeCommit":false,"messageTitle":"Clean up traces of AB3 in user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"225fd34ab68ba2f6deb209cfc900fbc33054f2b2","isMergeCommit":true,"messageTitle":"Merge pull request #20 from ys112/update-UG","messageBody":"Clean up traces of AB3 in user guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"d528149df7745dd73f52c7af02fc9a7bb9bb7bd4","isMergeCommit":false,"messageTitle":"Clean up user guide for HRConnect","messageBody":"Change related names in user guide like addressbook.jar to\nhrconnect.jar for relevance.\n\nWill have to make changes in code and gradle build to reflect the\nrefactor of name to HRConnect.\n","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"ec653a26065569b1147d3f1a1c0401e2030aa684","isMergeCommit":false,"messageTitle":"Clean up any mentions of address book related words to HRConnect","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}},{"hash":"aff3dc51f9fab075ca145ffb8e5b53b911d278e2","isMergeCommit":true,"messageTitle":"Merge pull request #24 from ys112/update-UG","messageBody":"Clean up user guide for HRConnect","fileTypesAndContributionMap":{}}]}],"xinen26":[{"date":"2024-02-27","commitResults":[{"hash":"e719870711d0cf4277bad8363f4c0c3f3eb371ff","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":0}}},{"hash":"d21645e77f9bf150bb382400ba992af001fbd894","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"daec8e73f3b0687ad3fa13de2e5e58d16bbeca3d","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"6132eba6bcb853aadcd0cad6a98341704e4a2140","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"0f27c787414747a2f33e77f55537a1e7797f2c5a","isMergeCommit":true,"messageTitle":"Merge pull request #12 from xinen26/Update-UG","messageBody":"Add Comment function into user guide","fileTypesAndContributionMap":{}},{"hash":"3188f83f6eff5a9a308eeea6c43c1d60c1831e49","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":84,"deletions":3}}},{"hash":"d2767249122c205d57f7dbe1e55732ef50618d01","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":154,"deletions":0}}},{"hash":"8adc30cdaf1644a32eddaf0cb1524619d35b7ab4","isMergeCommit":false,"messageTitle":"Change names for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":50}}},{"hash":"608a70e29abbcfa9580fc25d5922b72751a18e15","isMergeCommit":true,"messageTitle":"Merge pull request #13 from xinen26/Update-DG","messageBody":"Update developer guide for use case","fileTypesAndContributionMap":{}}]}],"ChrisHo1341":[{"date":"2024-03-07","commitResults":[{"hash":"df8daef8eba8fa9bc8c9dcefa4f34c3cd70e5c30","isMergeCommit":false,"messageTitle":"Update DevGuide and UserGuide","messageBody":"Add tag function in user guide and glossary to devguide\n","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":0}}},{"hash":"55378a4f85d6281275ac2d7741e644f47a96184f","isMergeCommit":true,"messageTitle":"Merge pull request #27 from ChrisHo1341/CH-v1.1","messageBody":"Update DevGuide and UserGuide","fileTypesAndContributionMap":{}},{"hash":"50d1de3995f1f0e080446b05f8da16ebf567e821","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"df0d56dc67b5eaa30761fc3968cf99869f5e99fd","isMergeCommit":true,"messageTitle":"Merge pull request #29 from ChrisHo1341/tutorial-adding-command","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"lihaoquan":{"docs":90,"functional-code":0,"test-code":0},"YuvBindal":{"docs":24,"functional-code":0,"test-code":0},"ys112":{"docs":99,"functional-code":0,"test-code":0},"xinen26":{"docs":241,"functional-code":0,"test-code":0},"ChrisHo1341":{"docs":13,"functional-code":0,"test-code":0}},"authorContributionVariance":{"lihaoquan":4771.2456,"YuvBindal":40.489796,"ys112":1724.4075,"xinen26":8643.742,"ChrisHo1341":14.92347},"authorDisplayNameMap":{"lihaoquan":"CS2103-F15-3 LI H..QUAN","YuvBindal":"CS2103-F15-3 BIND.. YUV","ys112":"CS2103-F15-3 YONG..SIAN","xinen26":"CS2103-F15-3 LEE ..N EN","ChrisHo1341":"CS2103-F15-3 HO W..PHER"}} diff --git a/AY2324S2-CS2103T-F10-1_tp_master/authorship.json b/AY2324S2-CS2103T-F10-1_tp_master/authorship.json index 21ab1923..15dc61d7 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":"-"},"content":"# Nursing Address Book","lastModifiedDate":"2024-02-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"Target user:","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"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":5,"author":{"gitId":"iamtr"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"Value proposition:","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"iamtr"},"content":"Streamlined text-based commands to manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"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":3,"-":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/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":"-"},"content":"Ward nurses","lastModifiedDate":"2024-03-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* manage a significant number of patient contacts with varying details","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* quickly access critical patient information in time-sensitive situations","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"-"},"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":"-"},"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":"-"},"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":"-"},"content":"| -------- | -------------------------------------- |-------------------------------|---------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new patient | store new patient records |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"-"},"content":"| `* * *` | user | view existing patient records | access information on existing patients |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"-"},"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,"-":383}},{"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 6641a3a6..cf178ca9 100644 --- a/AY2324S2-CS2103T-F10-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-F10-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"swtan346":[],"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":{}}]}],"ejnan":[],"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":0,"functional-code":0,"test-code":0},"iamtr":{"docs":3,"functional-code":0,"test-code":0},"ejnan":{"docs":0,"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":0.0,"iamtr":23.943876,"ejnan":0.0,"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":{}}]}],"ejnan":[],"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":0,"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":0.0,"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"}} diff --git a/AY2324S2-CS2103T-F11-1_tp_master/authorship.json b/AY2324S2-CS2103T-F11-1_tp_master/authorship.json index d1f95f4e..7337fa00 100644 --- a/AY2324S2-CS2103T-F11-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F11-1_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-F11-1/tp/graph/badge.svg?token\u003dBHN72CM28D)](https://codecov.io/gh/AY2324S2-CS2103T-F11-1/tp)","lastModifiedDate":"2024-02-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"shawnnlimm"},"content":"### nerdTrackerPlus","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"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":"shawnnlimm"},"content":"Are you a Computer Science TA having troubles with keeping track of student details and their progress?","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"shawnnlimm"},"content":"Introducing nerdTrackerPlus, your ultimate companion in managing student details and tracking their progress effortlessly! ","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"shawnnlimm"},"content":"Designed with Computer Science Teaching Assistants in mind, nerdTrackerPlus streamlines the process of organizing student information, grading assignments, and monitoring their academic journey. Say goodbye to the hassle of scattered spreadsheets and endless paperwork – with nerdTrackerPlus, you\u0027ll have everything you need at your fingertips to excel in your role as a TA. Let\u0027s simplify your workload and elevate your teaching experience together!\"","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"shawnnlimm"},"content":"### Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"shawnnlimm"},"content":"For the detailed documentation of this project, see the **[nerdTrackerPlus Product Website](https://nus-cs2103-ay2324s2.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"shawnnlimm"},"content":"### Acknowledgements","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"shawnnlimm"},"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-03-07"}],"authorContributionMap":{"shawnnlimm":15,"-":5}},{"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":"shawnnlimm"},"content":"### Shawn Lim","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"shawnnlimm"},"content":"\u003cimg src\u003d\"images/shawnnlimm.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"shawnnlimm"},"content":"[[github](https://github.com/shawnnlimm)]","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"shawnnlimm"},"content":"* Role: Developer","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"Ryo-Seah"},"content":"### Ryo Seah","lastModifiedDate":"2024-03-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"shawnnlimm"},"content":"\u003cimg src\u003d\"images/Ryo-Seah.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"Ryo-Seah"},"content":"[[github](http://github.com/Ryo-Seah)]","lastModifiedDate":"2024-03-03"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"Ryo-Seah"},"content":"* Responsibilities: Everything","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"thewongdylan"},"content":"### Dylan Wong","lastModifiedDate":"2024-03-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"shawnnlimm"},"content":"\u003cimg src\u003d\"images/thewongdylan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"thewongdylan"},"content":"[[github](http://github.com/thewongdylan)]","lastModifiedDate":"2024-03-03"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"thewongdylan"},"content":"* Responsibilities: Everything","lastModifiedDate":"2024-03-03"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"shamesjen"},"content":"### James Shen","lastModifiedDate":"2024-03-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"shamesjen"},"content":"\u003cimg src\u003d\"images/shamesjen.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"shamesjen"},"content":"[[github](http://github.com/shamesjen)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"shamesjen"},"content":"* Responsibilities: Search Features","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"shawnnlimm":6,"-":29,"shamesjen":4,"Ryo-Seah":3,"thewongdylan":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":"shawnnlimm"},"content":"* nerdTrackerPlus is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org/)","lastModifiedDate":"2024-03-06"},{"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":"shawnnlimm"},"content":"**Value proposition**: ","lastModifiedDate":"2024-03-06"},{"lineNumber":272,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":273,"author":{"gitId":"shawnnlimm"},"content":"nerdTrackerPlus helps Computer Science TAs manage students contacts through a CLI interface, which is much faster than a typical mouse/GUI driven app.","lastModifiedDate":"2024-03-06"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"shawnnlimm"},"content":"|---------|----------------------------------|---------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant (TBC) | add a new student | keep track of their contact details |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | delete a student | remove student entries that I no longer need |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | list students | view all students currently in my contacts |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | find a student by name | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | edit student details | ensure that student details is always updated |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | filter students by tag | make it easier to search for particular students |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | add tags to students | categorize student contacts for reference |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | delete tags | remove tags that are currently unused |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | delete tags from students | remove tags from students that do not belong to that category |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | user | close and exit the app | |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"shawnnlimm"},"content":"(For all use cases below, the **System** is `nerdTrackerPlus` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC01: Adding a student**","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"shawnnlimm"},"content":"**Main Success Scenario (MSS)**","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"shawnnlimm"},"content":"1. User request to add student.","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus adds the students with the relevant particulars.","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"shawnnlimm"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"shawnnlimm"},"content":"* 1a. The given particulars are invalid/missing.","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"shawnnlimm"},"content":" * 1a1. nerdTrackerPlus shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"shawnnlimm"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC02: Delete a student**","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"shawnnlimm"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"shawnnlimm"},"content":"3. User requests to delete a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"shawnnlimm"},"content":"4. nerdTrackerPlus deletes the person.","lastModifiedDate":"2024-03-06"},{"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":"-"},"content":"* 2a. The list is empty.","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":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"shawnnlimm"},"content":" * 3a1. nerdTrackerPlus shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC03: List students**","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"shawnnlimm"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"shawnnlimm"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC04: Find student**","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"shawnnlimm"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"shawnnlimm"},"content":"1. User requests to search a student in the contacts list by name.","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus shows all students in the list with the matching name.","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"shawnnlimm"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"shawnnlimm"},"content":"* 1a. User searches with invalid input.","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"shawnnlimm"},"content":" * 1a1. nerdTrackerPlus shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"shawnnlimm"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC05: Edit student details**","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"shawnnlimm"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"shawnnlimm"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"shawnnlimm"},"content":"3. User request to edit certain details of a particular student. ","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"shawnnlimm"},"content":"4. nerdTrackerPlus successfully edits student\u0027s details.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"shawnnlimm"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"shawnnlimm"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"shawnnlimm"},"content":"* 3a. User inputs invalid index or student particulars.","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"shawnnlimm"},"content":" * 3a1. nerdTrackerPlus shows an error message","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"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":408,"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":409,"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":410,"author":{"gitId":"shawnnlimm"},"content":"4. The commands should be clear and concise that are easy for teaching assistants to understand and use without extensive training.","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"shawnnlimm"},"content":"5. The application should only be designed for a single user.","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"shawnnlimm"},"content":"6. The application should respond promptly to user inputs, with minimal latency between command execution and feedback.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":419,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"shawnnlimm"},"content":"* **API**: Application Programming Interface, a set of rules, protocols, and tools that allows different software applications to communicate with each other.","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"shawnnlimm"},"content":"* **GUI**: Graphical User Interface, a type of user interface that allows users to interact with a computer system using graphical elements on the screen such as windows, icons, menus, and buttons.","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"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":430,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"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":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"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":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"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":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"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":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"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":464,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","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"}],"authorContributionMap":{"shawnnlimm":106,"-":368}},{"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":"shawnnlimm"},"content":"nerdTrackerPlus 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, nerdTrackerPlus can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"shawnnlimm"},"content":"### Table of Contents","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"shawnnlimm"},"content":"- [Quick Start](#quick-start)","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"shawnnlimm"},"content":"- [Features](#features)","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"shawnnlimm"},"content":" - [1. Viewing Help](#1-viewing-help--help) : `help`","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"shawnnlimm"},"content":" - [2. Adding a person](#2-adding-a-person--add) : `add`","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"shawnnlimm"},"content":" - [3. Listing all persons](#3-listing-all-persons--list) : `list`","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"shawnnlimm"},"content":" - [4. Editing a person](#4-editing-a-person--edit) : `edit` ","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"shawnnlimm"},"content":" - [5. Locating persons by name](#5-locating-persons-by-name--find) : `find`","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"shawnnlimm"},"content":" - [6. Delete a person](#6-deleting-a-person--delete) : `delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"shawnnlimm"},"content":" - [7. Remove a tag](#7-remove-a-tag--remove-tag) : `Remove Tag`","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"shawnnlimm"},"content":" - [8. Clearing all entries](#8-clearing-all-entries--clear) : `clear`","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"shawnnlimm"},"content":" - [9. Filtering by tags](#9-filtering-by-tags--filter) : `filter`","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"shawnnlimm"},"content":" - [10. Exiting the program](#10-exiting-the-program--exit) : `exit`","lastModifiedDate":"2024-03-06"},{"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":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"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":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"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":33,"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":34,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"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":37,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"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":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"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":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"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":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"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":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"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":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"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":72,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":74,"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":75,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"shawnnlimm"},"content":"### 1. Viewing help : `help`","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"shawnnlimm"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Format: `help`","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":"shawnnlimm"},"content":"### 2. Adding a person : `add`","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"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":98,"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":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"shawnnlimm"},"content":"### 3. Listing all persons : `list`","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"shawnnlimm"},"content":"### 4. Editing a person : `edit`","lastModifiedDate":"2024-03-06"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"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":113,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"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":116,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"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":121,"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":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"shawnnlimm"},"content":"### 5. Locating persons by name : `find`","lastModifiedDate":"2024-03-06"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"shawnnlimm"},"content":"### 6. Deleting a person : `delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"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":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"shawnnlimm"},"content":"### 7. Remove a tag : `Remove Tag`","lastModifiedDate":"2024-03-06"},{"lineNumber":156,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":157,"author":{"gitId":"Ryo-Seah"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":158,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":159,"author":{"gitId":"Ryo-Seah"},"content":"Format: `Remove Tag INDEX [t/TAG]…`","lastModifiedDate":"2024-03-03"},{"lineNumber":160,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":161,"author":{"gitId":"Ryo-Seah"},"content":"* Removes tags of the person at the specified `INDEX`.","lastModifiedDate":"2024-03-03"},{"lineNumber":162,"author":{"gitId":"Ryo-Seah"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-03"},{"lineNumber":163,"author":{"gitId":"Ryo-Seah"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-03"},{"lineNumber":164,"author":{"gitId":"Ryo-Seah"},"content":"* The tag must exist on the person","lastModifiedDate":"2024-03-03"},{"lineNumber":165,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":166,"author":{"gitId":"Ryo-Seah"},"content":"Examples:","lastModifiedDate":"2024-03-03"},{"lineNumber":167,"author":{"gitId":"Ryo-Seah"},"content":"* `list` followed by `Remove Tag 2 t/friend` Removes the friend tag from the 2nd person in the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":168,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":169,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":170,"author":{"gitId":"shawnnlimm"},"content":"### 8. Clearing all entries : `clear`","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"shawnnlimm"},"content":"### 9. Filtering by tags : `filter`","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"shamesjen"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":178,"author":{"gitId":"shamesjen"},"content":"Filters all entries with specified tags.","lastModifiedDate":"2024-03-03"},{"lineNumber":179,"author":{"gitId":"shamesjen"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":180,"author":{"gitId":"shamesjen"},"content":"Format: `filter [all/any] NUMBEROFTAGS TAGNAME [TAGNAME]`","lastModifiedDate":"2024-03-03"},{"lineNumber":181,"author":{"gitId":"shamesjen"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":182,"author":{"gitId":"shawnnlimm"},"content":"* If `filter all` is used and more than 1 tag is used to filter, only entries that match all tags will be shown.","lastModifiedDate":"2024-03-06"},{"lineNumber":183,"author":{"gitId":"shawnnlimm"},"content":"* If `filter any` is used and more than 1 tag is used to filter, all entries that match any one of the tags will be shown.","lastModifiedDate":"2024-03-06"},{"lineNumber":184,"author":{"gitId":"shawnnlimm"},"content":"* Tags are case in-sensitive.","lastModifiedDate":"2024-03-06"},{"lineNumber":185,"author":{"gitId":"shawnnlimm"},"content":"* The number of tags cannot be `0`.","lastModifiedDate":"2024-03-06"},{"lineNumber":186,"author":{"gitId":"shamesjen"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":187,"author":{"gitId":"shawnnlimm"},"content":"### 10. Exiting the program : `exit`","lastModifiedDate":"2024-03-06"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"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":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":199,"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":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":202,"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":203,"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":204,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":206,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"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":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":221,"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":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":223,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":225,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"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":230,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"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":233,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"shawnnlimm":30,"-":185,"shamesjen":6,"Ryo-Seah":14}},{"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":"shawnnlimm"},"content":"title: nerdTrackerPlus","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":"[![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":"shawnnlimm"},"content":"**nerdTrackerPlus 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":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"shawnnlimm"},"content":"* If you are interested in using nerdTrackerPlus, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"shawnnlimm"},"content":"* If you are interested about developing nerdTrackerPlus, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"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":{"shawnnlimm":4,"-":15}}] +[{"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-F11-1/tp/graph/badge.svg?token\u003dBHN72CM28D)](https://codecov.io/gh/AY2324S2-CS2103T-F11-1/tp)","lastModifiedDate":"2024-02-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"shawnnlimm"},"content":"### nerdTrackerPlus","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"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":"shawnnlimm"},"content":"Are you a Computer Science TA having troubles with keeping track of student details and their progress?","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"shawnnlimm"},"content":"Introducing nerdTrackerPlus, your ultimate companion in managing student details and tracking their progress effortlessly! ","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"shawnnlimm"},"content":"Designed with Computer Science Teaching Assistants in mind, nerdTrackerPlus streamlines the process of organizing student information, grading assignments, and monitoring their academic journey. Say goodbye to the hassle of scattered spreadsheets and endless paperwork – with nerdTrackerPlus, you\u0027ll have everything you need at your fingertips to excel in your role as a TA. Let\u0027s simplify your workload and elevate your teaching experience together!\"","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"shawnnlimm"},"content":"### Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"shawnnlimm"},"content":"For the detailed documentation of this project, see the **[nerdTrackerPlus Product Website](https://nus-cs2103-ay2324s2.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"shawnnlimm"},"content":"### Acknowledgements","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"shawnnlimm"},"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-03-07"}],"authorContributionMap":{"shawnnlimm":15,"-":5}},{"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":"shawnnlimm"},"content":"### Shawn Lim","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"shawnnlimm"},"content":"\u003cimg src\u003d\"images/shawnnlimm.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"shawnnlimm"},"content":"[[github](https://github.com/shawnnlimm)]","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"shawnnlimm"},"content":"* Role: Developer","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"Ryo-Seah"},"content":"### Ryo Seah","lastModifiedDate":"2024-03-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"shawnnlimm"},"content":"\u003cimg src\u003d\"images/ryo-seah.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"Ryo-Seah"},"content":"[[github](http://github.com/Ryo-Seah)]","lastModifiedDate":"2024-03-03"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"Ryo-Seah"},"content":"* Responsibilities: Everything","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"thewongdylan"},"content":"### Dylan Wong","lastModifiedDate":"2024-03-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"shawnnlimm"},"content":"\u003cimg src\u003d\"images/thewongdylan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"thewongdylan"},"content":"[[github](http://github.com/thewongdylan)]","lastModifiedDate":"2024-03-03"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"thewongdylan"},"content":"* Responsibilities: Everything","lastModifiedDate":"2024-03-03"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"shamesjen"},"content":"### James Shen","lastModifiedDate":"2024-03-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"shamesjen"},"content":"\u003cimg src\u003d\"images/shamesjen.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"shamesjen"},"content":"[[github](http://github.com/shamesjen)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"shamesjen"},"content":"* Responsibilities: Search Features","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"shawnnlimm":6,"-":29,"shamesjen":4,"Ryo-Seah":3,"thewongdylan":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":"shawnnlimm"},"content":"* nerdTrackerPlus is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org/)","lastModifiedDate":"2024-03-06"},{"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":"shawnnlimm"},"content":"**Value proposition**: ","lastModifiedDate":"2024-03-06"},{"lineNumber":272,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":273,"author":{"gitId":"shawnnlimm"},"content":"nerdTrackerPlus helps Computer Science TAs manage students contacts through a CLI interface, which is much faster than a typical mouse/GUI driven app.","lastModifiedDate":"2024-03-06"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"shawnnlimm"},"content":"|---------|----------------------------------|---------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant (TBC) | add a new student | keep track of their contact details |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | delete a student | remove student entries that I no longer need |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | list students | view all students currently in my contacts |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | find a student by name | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | edit student details | ensure that student details is always updated |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | filter students by tag | make it easier to search for particular students |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | add tags to students | categorize student contacts for reference |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | delete tags | remove tags that are currently unused |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | cs2040s teaching assistant | delete tags from students | remove tags from students that do not belong to that category |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"shawnnlimm"},"content":"| `* * *` | user | close and exit the app | |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"shawnnlimm"},"content":"(For all use cases below, the **System** is `nerdTrackerPlus` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC01: Adding a student**","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"shawnnlimm"},"content":"**Main Success Scenario (MSS)**","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"shawnnlimm"},"content":"1. User request to add student.","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus adds the students with the relevant particulars.","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"shawnnlimm"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"shawnnlimm"},"content":"* 1a. The given particulars are invalid/missing.","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"shawnnlimm"},"content":" * 1a1. nerdTrackerPlus shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"shawnnlimm"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC02: Delete a student**","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"shawnnlimm"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"shawnnlimm"},"content":"3. User requests to delete a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"shawnnlimm"},"content":"4. nerdTrackerPlus deletes the person.","lastModifiedDate":"2024-03-06"},{"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":"-"},"content":"* 2a. The list is empty.","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":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"shawnnlimm"},"content":" * 3a1. nerdTrackerPlus shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC03: List students**","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"shawnnlimm"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"shawnnlimm"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC04: Find student**","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"shawnnlimm"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"shawnnlimm"},"content":"1. User requests to search a student in the contacts list by name.","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus shows all students in the list with the matching name.","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"shawnnlimm"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"shawnnlimm"},"content":"* 1a. User searches with invalid input.","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"shawnnlimm"},"content":" * 1a1. nerdTrackerPlus shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"shawnnlimm"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"shawnnlimm"},"content":"**Use case UC05: Edit student details**","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"shawnnlimm"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"shawnnlimm"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"shawnnlimm"},"content":"2. nerdTrackerPlus shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"shawnnlimm"},"content":"3. User request to edit certain details of a particular student. ","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"shawnnlimm"},"content":"4. nerdTrackerPlus successfully edits student\u0027s details.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"shawnnlimm"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"shawnnlimm"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"shawnnlimm"},"content":"* 3a. User inputs invalid index or student particulars.","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"shawnnlimm"},"content":" * 3a1. nerdTrackerPlus shows an error message","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"shawnnlimm"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"shawnnlimm"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"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":408,"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":409,"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":410,"author":{"gitId":"shawnnlimm"},"content":"4. The commands should be clear and concise that are easy for teaching assistants to understand and use without extensive training.","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"shawnnlimm"},"content":"5. The application should only be designed for a single user.","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"shawnnlimm"},"content":"6. The application should respond promptly to user inputs, with minimal latency between command execution and feedback.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":419,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"shawnnlimm"},"content":"* **API**: Application Programming Interface, a set of rules, protocols, and tools that allows different software applications to communicate with each other.","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"shawnnlimm"},"content":"* **GUI**: Graphical User Interface, a type of user interface that allows users to interact with a computer system using graphical elements on the screen such as windows, icons, menus, and buttons.","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"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":430,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"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":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"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":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"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":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"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":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"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":464,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","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"}],"authorContributionMap":{"shawnnlimm":106,"-":368}},{"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":"shawnnlimm"},"content":"nerdTrackerPlus 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, nerdTrackerPlus can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"shawnnlimm"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"shawnnlimm"},"content":"### Table of Contents","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"shawnnlimm"},"content":"- [Quick Start](#quick-start)","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"shawnnlimm"},"content":"- [Features](#features)","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"shawnnlimm"},"content":" - [1. Viewing Help](#1-viewing-help--help) : `help`","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"shawnnlimm"},"content":" - [2. Adding a person](#2-adding-a-person--add) : `add`","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"shawnnlimm"},"content":" - [3. Listing all persons](#3-listing-all-persons--list) : `list`","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"shawnnlimm"},"content":" - [4. Editing a person](#4-editing-a-person--edit) : `edit` ","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"shawnnlimm"},"content":" - [5. Locating persons by name](#5-locating-persons-by-name--find) : `find`","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"shawnnlimm"},"content":" - [6. Delete a person](#6-deleting-a-person--delete) : `delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"shawnnlimm"},"content":" - [7. Remove a tag](#7-remove-a-tag--remove-tag) : `Remove Tag`","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"shawnnlimm"},"content":" - [8. Clearing all entries](#8-clearing-all-entries--clear) : `clear`","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"shawnnlimm"},"content":" - [9. Filtering by tags](#9-filtering-by-tags--filter) : `filter`","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"shawnnlimm"},"content":" - [10. Exiting the program](#10-exiting-the-program--exit) : `exit`","lastModifiedDate":"2024-03-06"},{"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":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"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":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"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":33,"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":34,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"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":37,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"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":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"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":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"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":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"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":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"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":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"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":72,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":74,"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":75,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"shawnnlimm"},"content":"### 1. Viewing help : `help`","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"shawnnlimm"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Format: `help`","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":"shawnnlimm"},"content":"### 2. Adding a person : `add`","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"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":98,"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":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"shawnnlimm"},"content":"### 3. Listing all persons : `list`","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"shawnnlimm"},"content":"### 4. Editing a person : `edit`","lastModifiedDate":"2024-03-06"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"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":113,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"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":116,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"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":121,"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":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"shawnnlimm"},"content":"### 5. Locating persons by name : `find`","lastModifiedDate":"2024-03-06"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"shawnnlimm"},"content":"### 6. Deleting a person : `delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"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":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"shawnnlimm"},"content":"### 7. Remove a tag : `Remove Tag`","lastModifiedDate":"2024-03-06"},{"lineNumber":156,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":157,"author":{"gitId":"Ryo-Seah"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":158,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":159,"author":{"gitId":"Ryo-Seah"},"content":"Format: `Remove Tag INDEX [t/TAG]…`","lastModifiedDate":"2024-03-03"},{"lineNumber":160,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":161,"author":{"gitId":"Ryo-Seah"},"content":"* Removes tags of the person at the specified `INDEX`.","lastModifiedDate":"2024-03-03"},{"lineNumber":162,"author":{"gitId":"Ryo-Seah"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-03"},{"lineNumber":163,"author":{"gitId":"Ryo-Seah"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-03"},{"lineNumber":164,"author":{"gitId":"Ryo-Seah"},"content":"* The tag must exist on the person","lastModifiedDate":"2024-03-03"},{"lineNumber":165,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":166,"author":{"gitId":"Ryo-Seah"},"content":"Examples:","lastModifiedDate":"2024-03-03"},{"lineNumber":167,"author":{"gitId":"Ryo-Seah"},"content":"* `list` followed by `Remove Tag 2 t/friend` Removes the friend tag from the 2nd person in the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":168,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":169,"author":{"gitId":"Ryo-Seah"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":170,"author":{"gitId":"shawnnlimm"},"content":"### 8. Clearing all entries : `clear`","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"shawnnlimm"},"content":"### 9. Filtering by tags : `filter`","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"shamesjen"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":178,"author":{"gitId":"shamesjen"},"content":"Filters all entries with specified tags.","lastModifiedDate":"2024-03-03"},{"lineNumber":179,"author":{"gitId":"shamesjen"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":180,"author":{"gitId":"shamesjen"},"content":"Format: `filter [all/any] NUMBEROFTAGS TAGNAME [TAGNAME]`","lastModifiedDate":"2024-03-03"},{"lineNumber":181,"author":{"gitId":"shamesjen"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":182,"author":{"gitId":"shawnnlimm"},"content":"* If `filter all` is used and more than 1 tag is used to filter, only entries that match all tags will be shown.","lastModifiedDate":"2024-03-06"},{"lineNumber":183,"author":{"gitId":"shawnnlimm"},"content":"* If `filter any` is used and more than 1 tag is used to filter, all entries that match any one of the tags will be shown.","lastModifiedDate":"2024-03-06"},{"lineNumber":184,"author":{"gitId":"shawnnlimm"},"content":"* Tags are case in-sensitive.","lastModifiedDate":"2024-03-06"},{"lineNumber":185,"author":{"gitId":"shawnnlimm"},"content":"* The number of tags cannot be `0`.","lastModifiedDate":"2024-03-06"},{"lineNumber":186,"author":{"gitId":"shamesjen"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":187,"author":{"gitId":"shawnnlimm"},"content":"### 10. Exiting the program : `exit`","lastModifiedDate":"2024-03-06"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"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":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":199,"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":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":202,"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":203,"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":204,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":206,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"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":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":221,"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":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":223,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":225,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"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":230,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"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":233,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"shawnnlimm":30,"-":185,"shamesjen":6,"Ryo-Seah":14}},{"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":"shawnnlimm"},"content":"title: nerdTrackerPlus","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":"[![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":"shawnnlimm"},"content":"**nerdTrackerPlus 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":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"shawnnlimm"},"content":"* If you are interested in using nerdTrackerPlus, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"shawnnlimm"},"content":"* If you are interested about developing nerdTrackerPlus, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"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":{"shawnnlimm":4,"-":15}}] diff --git a/AY2324S2-CS2103T-F11-1_tp_master/commits.json b/AY2324S2-CS2103T-F11-1_tp_master/commits.json index 7fe114c0..01612148 100644 --- a/AY2324S2-CS2103T-F11-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-F11-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"shawnnlimm":[{"date":"2024-02-29","commitResults":[{"hash":"c3300a626c7e8569f3d8546b399748b24ce48874","isMergeCommit":false,"messageTitle":"docs: Update AboutUs details","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":7}}}]},{"date":"2024-03-04","commitResults":[{"hash":"9121062e15ac536c065d580668747604ad2aa813","isMergeCommit":true,"messageTitle":"Merge pull request #23 from shamesjen/master","messageBody":"Docs: Update About Us and User Guide","fileTypesAndContributionMap":{}},{"hash":"6582c1a503a5ecdc39fee3b02ed34567566a8935","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into docs/about-us","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"edd2b895dd8e77173f3c32e0415d8790ea99002e","isMergeCommit":false,"messageTitle":"docs: Update UG and DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":142,"deletions":40}}}]},{"date":"2024-03-07","commitResults":[{"hash":"445d24cd915c9dab16c5f18a91478f1ebe665ffb","isMergeCommit":false,"messageTitle":"docs: Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":13}}},{"hash":"402ff51bdca73f4443a8bac5a7edccb62d047d41","isMergeCommit":false,"messageTitle":"docs: Update Index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4b5aa3ab9a57a94136429881176d7690cbdc8d21","isMergeCommit":true,"messageTitle":"Merge pull request #25 from shawnnlimm/docs/readme","messageBody":"docs: Update README","fileTypesAndContributionMap":{}}]}],"shamesjen":[{"date":"2024-03-03","commitResults":[{"hash":"0446c4f0f513c5592adaca7a1c51073b5b979d79","isMergeCommit":false,"messageTitle":"add a photogragh and update the readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":4}}},{"hash":"1ddb8ca60ecf692037687113fc26bd61715f1cbb","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-shamesjen\u0027 merge my edits","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5b4a950fa1cd770a6f92bffaf158eecbe46d1fd7","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Ryo-Seah/master","messageBody":"Docs: Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"1c2990b30f6227e784a2270e0d93bdf51a0d95a8","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F11-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5980c903b11854e7d83e7a890a58e1ae342fec50","isMergeCommit":false,"messageTitle":"add a photogragh and update the readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":16}}},{"hash":"fd2a4daefcd3c178faef5a7167b575306c7d6724","isMergeCommit":true,"messageTitle":"merge changes from upstream","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2820718ac5549aa64e4afc9fda04e9efe4aa9f5d","isMergeCommit":false,"messageTitle":"fix a typo in the aboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"1df6b039492c5318be1736e1cc6b24936c297eef","isMergeCommit":true,"messageTitle":"Merge pull request #24 from shawnnlimm/docs/about-us","messageBody":"docs: Update DG and UG","fileTypesAndContributionMap":{}}]}],"Ryo-Seah":[{"date":"2024-03-03","commitResults":[{"hash":"8d26c210767bfbdb54120f786ef9f8d7329e85ee","isMergeCommit":true,"messageTitle":"Merge pull request #15 from shawnnlimm/docs/about-us","messageBody":"docs: Update AboutUs details","fileTypesAndContributionMap":{}},{"hash":"1eb8ebe95f45fe1e8d3a90f1a1773c8dab26a8d0","isMergeCommit":false,"messageTitle":"Update Aboutus -Ryo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"b509fa2c6c1384f44867e66af8e20c24ab5396cf","isMergeCommit":false,"messageTitle":"Updated User Guide, add Remove Tag","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":0}}},{"hash":"24730f1625ff2fbc8716e24c3cf43669a7d5cf54","isMergeCommit":true,"messageTitle":"Merge pull request #20 from thewongdylan/master","messageBody":"Update AboutUs -Dylan","fileTypesAndContributionMap":{}}]}],"thewongdylan":[{"date":"2024-03-03","commitResults":[{"hash":"d9f77585ad6cf6e736e514b897589553c3f38ed5","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"Edited description, added image\n","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"f6c303dec0e612d6f3d5ddf03b08e61b2cc6dcd2","isMergeCommit":true,"messageTitle":"Merge branch \u0027docs/about-us\u0027","messageBody":"","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"shawnnlimm":{"docs":161,"functional-code":0,"test-code":0},"shamesjen":{"docs":10,"functional-code":0,"test-code":0},"Ryo-Seah":{"docs":17,"functional-code":0,"test-code":0},"thewongdylan":{"docs":3,"functional-code":0,"test-code":0}},"authorContributionVariance":{"shawnnlimm":2191.1685,"shamesjen":111.49491,"Ryo-Seah":38.204082,"thewongdylan":4.244898},"authorDisplayNameMap":{"shawnnlimm":"CS2103T-F11-1 SHAW..IJIE","shamesjen":"CS2103T-F11-1 SHEN..AMES","Ryo-Seah":"CS2103T-F11-1 SEAH.. RYO","thewongdylan":"CS2103T-F11-1 DYLA.. WAI"}} +{"authorDailyContributionsMap":{"shawnnlimm":[{"date":"2024-02-29","commitResults":[{"hash":"c3300a626c7e8569f3d8546b399748b24ce48874","isMergeCommit":false,"messageTitle":"docs: Update AboutUs details","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":7}}}]},{"date":"2024-03-04","commitResults":[{"hash":"9121062e15ac536c065d580668747604ad2aa813","isMergeCommit":true,"messageTitle":"Merge pull request #23 from shamesjen/master","messageBody":"Docs: Update About Us and User Guide","fileTypesAndContributionMap":{}},{"hash":"6582c1a503a5ecdc39fee3b02ed34567566a8935","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into docs/about-us","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"edd2b895dd8e77173f3c32e0415d8790ea99002e","isMergeCommit":false,"messageTitle":"docs: Update UG and DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":142,"deletions":40}}}]},{"date":"2024-03-07","commitResults":[{"hash":"445d24cd915c9dab16c5f18a91478f1ebe665ffb","isMergeCommit":false,"messageTitle":"docs: Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":13}}},{"hash":"402ff51bdca73f4443a8bac5a7edccb62d047d41","isMergeCommit":false,"messageTitle":"docs: Update Index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4b5aa3ab9a57a94136429881176d7690cbdc8d21","isMergeCommit":true,"messageTitle":"Merge pull request #25 from shawnnlimm/docs/readme","messageBody":"docs: Update README","fileTypesAndContributionMap":{}},{"hash":"2a653f3dab103c4ea4f56c3dc1b3d315d0dad101","isMergeCommit":false,"messageTitle":"docs: Fix minor case issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6e7931d700498369975a27dae630ed3926905ccd","isMergeCommit":true,"messageTitle":"Merge pull request #26 from shawnnlimm/docs/readme","messageBody":"docs: Update _config.yml","fileTypesAndContributionMap":{}}]}],"shamesjen":[{"date":"2024-03-03","commitResults":[{"hash":"0446c4f0f513c5592adaca7a1c51073b5b979d79","isMergeCommit":false,"messageTitle":"add a photogragh and update the readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":4}}},{"hash":"1ddb8ca60ecf692037687113fc26bd61715f1cbb","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-shamesjen\u0027 merge my edits","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5b4a950fa1cd770a6f92bffaf158eecbe46d1fd7","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Ryo-Seah/master","messageBody":"Docs: Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"1c2990b30f6227e784a2270e0d93bdf51a0d95a8","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F11-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5980c903b11854e7d83e7a890a58e1ae342fec50","isMergeCommit":false,"messageTitle":"add a photogragh and update the readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":16}}},{"hash":"fd2a4daefcd3c178faef5a7167b575306c7d6724","isMergeCommit":true,"messageTitle":"merge changes from upstream","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2820718ac5549aa64e4afc9fda04e9efe4aa9f5d","isMergeCommit":false,"messageTitle":"fix a typo in the aboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"1df6b039492c5318be1736e1cc6b24936c297eef","isMergeCommit":true,"messageTitle":"Merge pull request #24 from shawnnlimm/docs/about-us","messageBody":"docs: Update DG and UG","fileTypesAndContributionMap":{}}]}],"Ryo-Seah":[{"date":"2024-03-03","commitResults":[{"hash":"8d26c210767bfbdb54120f786ef9f8d7329e85ee","isMergeCommit":true,"messageTitle":"Merge pull request #15 from shawnnlimm/docs/about-us","messageBody":"docs: Update AboutUs details","fileTypesAndContributionMap":{}},{"hash":"1eb8ebe95f45fe1e8d3a90f1a1773c8dab26a8d0","isMergeCommit":false,"messageTitle":"Update Aboutus -Ryo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"b509fa2c6c1384f44867e66af8e20c24ab5396cf","isMergeCommit":false,"messageTitle":"Updated User Guide, add Remove Tag","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":0}}},{"hash":"24730f1625ff2fbc8716e24c3cf43669a7d5cf54","isMergeCommit":true,"messageTitle":"Merge pull request #20 from thewongdylan/master","messageBody":"Update AboutUs -Dylan","fileTypesAndContributionMap":{}}]}],"thewongdylan":[{"date":"2024-03-03","commitResults":[{"hash":"d9f77585ad6cf6e736e514b897589553c3f38ed5","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"Edited description, added image\n","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"f6c303dec0e612d6f3d5ddf03b08e61b2cc6dcd2","isMergeCommit":true,"messageTitle":"Merge branch \u0027docs/about-us\u0027","messageBody":"","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"shawnnlimm":{"docs":161,"functional-code":0,"test-code":0},"shamesjen":{"docs":10,"functional-code":0,"test-code":0},"Ryo-Seah":{"docs":17,"functional-code":0,"test-code":0},"thewongdylan":{"docs":3,"functional-code":0,"test-code":0}},"authorContributionVariance":{"shawnnlimm":2196.2295,"shamesjen":111.49491,"Ryo-Seah":38.204082,"thewongdylan":4.244898},"authorDisplayNameMap":{"shawnnlimm":"CS2103T-F11-1 SHAW..IJIE","shamesjen":"CS2103T-F11-1 SHEN..AMES","Ryo-Seah":"CS2103T-F11-1 SEAH.. RYO","thewongdylan":"CS2103T-F11-1 DYLA.. WAI"}} diff --git a/AY2324S2-CS2103T-F11-2_tp_master/authorship.json b/AY2324S2-CS2103T-F11-2_tp_master/authorship.json index e7b9799a..28538134 100644 --- a/AY2324S2-CS2103T-F11-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F11-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Darkarche3"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F11-2/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-F11-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":"meowwtama"},"content":"## About MyBookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"meowwtama"},"content":"* MyBookshelf is designed to help improve the management of public community libraries.","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"meowwtama"},"content":"* It helps to keep track of book transactions within the library.","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"meowwtama"},"content":"* This helps to prevent irresponsible behaviour that violates the library\u0027s borrowing guidelines, easing management duties.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"meowwtama"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Darkarche3"},"content":" * The project is CLI based to make it quick to use and easy for users who prefer typing commands over mouse operations.","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Darkarche3"},"content":" * The user can add, edit, find or delete borrowers in order to keep track of who is using their library","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Darkarche3"},"content":" * The user can also keep track of borrow and return transactions.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Darkarche3"},"content":" * The project simulates an ongoing software project for a desktop application (called AddressBook) used for managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Darkarche3"},"content":" * It is written in OOP fashion. It provides a reasonably well-written code base bigger (around 6 KLoC), without being overwhelmingly big.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Darkarche3"},"content":" * It comes with a reasonable level of user and developer documentation.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"meowwtama"},"content":"* Example usages:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **add** new borrower","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **list** all borrowers","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **edit** an existing borrower","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **find** borrower whose names contain the given keywords","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **delete** an existing borrower","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to create a **borrow** transaction","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to create a **return** transaction","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Ty-stan0417"},"content":"## Acknowledgement","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"Ty-stan0417"},"content":"* For the detailed documentation of this project, see the **[MyBookshelf Product Website](https://ay2324s2-cs2103t-f11-2.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"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":{"Darkarche3":7,"Ty-stan0417":9,"meowwtama":7,"-":5}},{"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":"jinhanfromNUS"},"content":"### Ho Jin Han","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"jinhanfromNUS"},"content":"\u003cimg src\u003d\"images/jinhanfromnus.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"jinhanfromNUS"},"content":"[[github](http://github.com/jinhanfromNUS)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"jinhanfromNUS"},"content":"[[portfolio](team/jinhanfromNUS.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"jinhanfromNUS"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"jinhanfromNUS"},"content":"* Responsibilities: Features and Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"meowwtama"},"content":"### Khoo Jing Xiang","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"meowwtama"},"content":"\u003cimg src\u003d\"images/meowwtama.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"meowwtama"},"content":"[[github](http://github.com/meowwtama)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"meowwtama"},"content":"[[portfolio](team/meowwtama.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"meowwtama"},"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":"ashleyclx"},"content":"### Ashley Chang","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ashleyclx"},"content":"\u003cimg src\u003d\"images/ashleyclx.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"ashleyclx"},"content":"[[github](http://github.com/ashleyclx)] [[portfolio](team/ashleyclx.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":"ashleyclx"},"content":"* Responsibilities: Features and Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"Ty-stan0417"},"content":"### Tan Yi-Sheng","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"Darkarche3"},"content":"\u003cimg src\u003d\"images/ty-stan0417.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"Ty-stan0417"},"content":"[[github](http://github.com/Ty-stan0417)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"Ty-stan0417"},"content":"[[portfolio](team/Ty-stan0417.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"Ty-stan0417"},"content":"* Responsibilities: Features and Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"Darkarche3"},"content":"### Shenoy Suraj Bantwal","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"Darkarche3"},"content":"\u003cimg src\u003d\"images/darkarche3.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Darkarche3"},"content":"[[github](https://github.com/Darkarche3)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"Darkarche3"},"content":"[[portfolio](team/Darkarche3.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Darkarche3"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Darkarche3":6,"Ty-stan0417":4,"ashleyclx":4,"jinhanfromNUS":6,"meowwtama":5,"-":34}},{"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":"jinhanfromNUS"},"content":"| -------- | ---------- | ------------------------------------------------ | -------------------------------------------------------------------------------- |","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record the phone number of the borrower | send SMS reminders to notify them that someone else is looking for the book |","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record the email address of the borrower | send an email reminders to notify them that someone else is looking for the book |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record the postal address of the borrower | send a warning letter when breach community guidelines |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record how many books the borrower has borrowed | keep track the position of the books |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record the date the borrower borrowed the book | calculate when they need to return the book |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"Ty-stan0417"},"content":"(For all use cases below, the **System** is the `MyBookshelf` and the **Actor** is the `librarian`, unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"Ty-stan0417"},"content":"**Use case: Borrower borrows a book from the library**","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"Ty-stan0417"},"content":"1. Borrower requests to borrow a book.","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"Ty-stan0417"},"content":"2. Librarian requests to list borrowers.","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"Ty-stan0417"},"content":"3. MyBookshelf shows a list of borrowers.","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"Ty-stan0417"},"content":"4. Librarian adds the book to the borrower.","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"Ty-stan0417"},"content":"5. MyBookshelf updates the borrower\u0027s details.","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"Ty-stan0417"},"content":"* 4a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"Ty-stan0417"},"content":" * 4a1. MyBookshelf shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"Ty-stan0417"},"content":" Use case resumes at step 3.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"meowwtama"},"content":"**Use case: Borrower returns a book to the library**","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"meowwtama"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"meowwtama"},"content":"1. Borrower requests to return a book.","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"meowwtama"},"content":"2. Librarian requests to list borrowers.","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"meowwtama"},"content":"3. MyBookshelf shows a list of borrowers.","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"meowwtama"},"content":"4. Librarian removes the book from the borrower.","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"meowwtama"},"content":"5. MyBookshelf updates the borrower\u0027s details. ","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"meowwtama"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"meowwtama"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"meowwtama"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"meowwtama"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"meowwtama"},"content":"* 4a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"meowwtama"},"content":" * 4a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"meowwtama"},"content":" Use case resumes at step 3.","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"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":348,"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":349,"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":350,"author":{"gitId":"Darkarche3"},"content":"4. Should be easy to use and fast to learn for users who are new to this application.","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"Darkarche3"},"content":"5. Response time should be fast enough that it does not take the user a long time to use it.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"Darkarche3"},"content":"6. Should be easy to recognise and remember necessary commands to minimise need for user to check what command to use.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":359,"author":{"gitId":"ashleyclx"},"content":"* **Librarian**: Main target user of My Bookshelf (community library manager)","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"ashleyclx"},"content":"* **Borrower**: People who borrow books from library that we need to keep track of contact details","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"ashleyclx"},"content":"* **Book**: Contains details relating to book lent to the Borrower","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"ashleyclx"},"content":"* **Borrow**: Borrower takes a book from the community library","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"ashleyclx"},"content":"* **Return**: Borrower gives back the book they borrowed to the community library","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"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":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/div\u003e","lastModifiedDate":"2020-05-23"},{"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":{"Darkarche3":3,"Ty-stan0417":10,"ashleyclx":5,"jinhanfromNUS":6,"meowwtama":24,"-":368}},{"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":"ashleyclx"},"content":"My Bookshelf is a **desktop app for librarians managing contacts and borrowing status of borrowers of books, 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, My Bookshelf can get your contact and borrowing management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"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":"-"},"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":" * `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":"ashleyclx"},"content":"### Adding a borrower: `add`","lastModifiedDate":"2024-03-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"ashleyclx"},"content":"Adds a borrower to the address book.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"A borrower can have any number of tags (including 0)","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Listing all borrowers : `list`","lastModifiedDate":"2024-03-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"ashleyclx"},"content":"Shows a list of all borrowers in the address book.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Editing a borrower : `edit`","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"ashleyclx"},"content":"Edits an existing borrowers in the address book.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* Edits the borrower at the specified `INDEX`. The index refers to the index number shown in the displayed borrower list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* When editing tags, the existing tags of the borrower will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-03-07"},{"lineNumber":105,"author":{"gitId":"ashleyclx"},"content":"* You can remove all the borrower’s tags by typing `t/` without","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st borrower to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Locating borrowers by name: `find`","lastModifiedDate":"2024-03-07"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"ashleyclx"},"content":"Finds borrowers whose names contain any of the given keywords.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* Borrowers matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Deleting a borrower : `delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"ashleyclx"},"content":"Deletes the specified borrrower from the address book.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* Deletes the borrrower at the specified `INDEX`.","lastModifiedDate":"2024-03-07"},{"lineNumber":137,"author":{"gitId":"ashleyclx"},"content":"* The index refers to the index number shown in the displayed borrower list.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* `list` followed by `delete 2` deletes the 2nd borrrower in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"ashleyclx"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st borrrower in the results of the `find` command.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Borrow a book by a borrower: `borrow`","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"ashleyclx"},"content":"Description","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"ashleyclx"},"content":"Format: ``","lastModifiedDate":"2024-03-07"},{"lineNumber":161,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"ashleyclx"},"content":"### Return a book from a borrower : `return`","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"ashleyclx"},"content":"Description","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"ashleyclx"},"content":"Format: ``","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":168,"author":{"gitId":"ashleyclx"},"content":"### Donate a book from a borrower : `donate`","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"ashleyclx"},"content":"Description","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"ashleyclx"},"content":"Format: ``","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":174,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"ashleyclx"},"content":"My Bookshelf 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-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":180,"author":{"gitId":"ashleyclx"},"content":"My Bookshelf 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-07"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":182,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":183,"author":{"gitId":"ashleyclx"},"content":"If your changes to the data file makes its format invalid, My Bookshelf 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-07"},{"lineNumber":184,"author":{"gitId":"ashleyclx"},"content":"Furthermore, certain edits can cause the My Bookshelf 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-07"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"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":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":202,"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":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":204,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":206,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"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":211,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"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":214,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"ashleyclx"},"content":"**Borrow**","lastModifiedDate":"2024-03-07"},{"lineNumber":218,"author":{"gitId":"ashleyclx"},"content":"**Return**","lastModifiedDate":"2024-03-07"},{"lineNumber":219,"author":{"gitId":"ashleyclx"},"content":"**Donate**","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"ashleyclx":46,"-":173}},{"path":"docs/team/Darkarche3.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Darkarche3"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Darkarche3"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Darkarche3"},"content":"title: Suraj\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Darkarche3"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Darkarche3"},"content":"### Project: My Bookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Darkarche3"},"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":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Darkarche3"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Darkarche3"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Darkarche3"},"content":" * What it does:","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Darkarche3"},"content":" * Justification:","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Darkarche3"},"content":" * Highlights:","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Darkarche3"},"content":" * Credits:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Darkarche3"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Darkarche3"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Darkarche3"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Darkarche3"},"content":" * Managed releases `v0.0` - `v0.0rc` (0 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Darkarche3"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"Darkarche3"},"content":" * Not done yet (Pull Requests: [#5](), [#12](), [#13](), [#15]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"Darkarche3"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Darkarche3"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Darkarche3"},"content":" * Change Ui.png","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Darkarche3"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Darkarche3"},"content":" * Add user stories","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"Darkarche3"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"Darkarche3"},"content":" * PRs reviewed (with non-trivial review comments): [\\#1](), [\\#18]()","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"Darkarche3"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"Darkarche3"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"Darkarche3"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"Darkarche3"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"Darkarche3"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Darkarche3":41}},{"path":"docs/team/Ty-stan0417.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Ty-stan0417"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Ty-stan0417"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Ty-stan0417"},"content":"title: Yi-Sheng\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Ty-stan0417"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Ty-stan0417"},"content":"### Project: My Bookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Ty-stan0417"},"content":"MyBookshelf is a desktop application used for managing books. 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":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Ty-stan0417"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Ty-stan0417"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Ty-stan0417"},"content":" * What it does:","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Ty-stan0417"},"content":" * Justification:","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Ty-stan0417"},"content":" * Highlights:","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Ty-stan0417"},"content":" * Credits:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Ty-stan0417"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Ty-stan0417"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Ty-stan0417"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Ty-stan0417"},"content":" * Managed releases `v0.0` - `v0.0rc` (0 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Ty-stan0417"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet (Pull requests [\\#21](), [\\#21]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Ty-stan0417"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Ty-stan0417"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Ty-stan0417"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"Ty-stan0417"},"content":" * Added to Use Cases [\\#16]()","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"Ty-stan0417"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"Ty-stan0417"},"content":" * PRs reviewed (with non-trivial review comments): [\\#18]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"Ty-stan0417"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"Ty-stan0417"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Ty-stan0417":46}},{"path":"docs/team/ashleyclx.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ashleyclx"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"ashleyclx"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"ashleyclx"},"content":"title: Ashley Chang\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"ashleyclx"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"ashleyclx"},"content":"### Project: My Bookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"ashleyclx"},"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":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"ashleyclx"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"ashleyclx"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"ashleyclx"},"content":" * What it does:","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"ashleyclx"},"content":" * Justification:","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"ashleyclx"},"content":" * Highlights:","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"ashleyclx"},"content":" * Credits:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"ashleyclx"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"ashleyclx"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"ashleyclx"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"ashleyclx"},"content":" * Managed releases `v0.0` - `v0.0rc` (0 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"ashleyclx"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"ashleyclx"},"content":" * Not done yet (Pull requests [\\#19](), [\\#19]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"ashleyclx"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"ashleyclx"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"ashleyclx"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"ashleyclx"},"content":" * Added to Glossary [\\#14]()","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"ashleyclx"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"ashleyclx"},"content":" * PRs reviewed (with non-trivial review comments): [\\#19]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"ashleyclx"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"ashleyclx"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"ashleyclx":46}},{"path":"docs/team/jinhanfromNUS.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jinhanfromNUS"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"jinhanfromNUS"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"jinhanfromNUS"},"content":"title: Jin Han\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"jinhanfromNUS"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"jinhanfromNUS"},"content":"### Project: My Bookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"jinhanfromNUS"},"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":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"jinhanfromNUS"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"jinhanfromNUS"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"jinhanfromNUS"},"content":" * What it does:","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"jinhanfromNUS"},"content":" * Justification:","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"jinhanfromNUS"},"content":" * Highlights:","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"jinhanfromNUS"},"content":" * Credits:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"jinhanfromNUS"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"jinhanfromNUS"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"jinhanfromNUS"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"jinhanfromNUS"},"content":" * Managed releases `v0.0` - `v0.0rc` (0 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"jinhanfromNUS"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"jinhanfromNUS"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"jinhanfromNUS"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"jinhanfromNUS"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"jinhanfromNUS"},"content":" * Change Ui.png","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"jinhanfromNUS"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"jinhanfromNUS"},"content":" * Add user stories","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"jinhanfromNUS"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"jinhanfromNUS"},"content":" * PRs reviewed (with non-trivial review comments): [\\#1](), [\\#18]()","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"jinhanfromNUS"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"jinhanfromNUS"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"jinhanfromNUS"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"jinhanfromNUS"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"jinhanfromNUS"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"jinhanfromNUS":41}},{"path":"docs/team/meowwtama.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":"meowwtama"},"content":"title: Khoo Jing Xiang\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":{"meowwtama":1,"-":45}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Darkarche3"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F11-2/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-F11-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":"meowwtama"},"content":"## About MyBookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"meowwtama"},"content":"* MyBookshelf is designed to help improve the management of public community libraries.","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"meowwtama"},"content":"* It helps to keep track of book transactions within the library.","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"meowwtama"},"content":"* This helps to prevent irresponsible behaviour that violates the library\u0027s borrowing guidelines, easing management duties.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"meowwtama"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Darkarche3"},"content":"## Project Details","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Darkarche3"},"content":" * The project is CLI based to make it quick to use and easy for users who prefer typing commands over mouse operations.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Darkarche3"},"content":" * The user can add, edit, find or delete borrowers in order to keep track of who is using their library","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Darkarche3"},"content":" * The user can also keep track of borrow and return transactions.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Darkarche3"},"content":" * The project simulates an ongoing software project for a desktop application (called AddressBook) used for managing contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Darkarche3"},"content":" * It is written in OOP fashion. It provides a reasonably well-written code base bigger (around 6 KLoC), without being overwhelmingly big.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Darkarche3"},"content":" * It comes with a reasonable level of user and developer documentation.","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"meowwtama"},"content":"* Example usages:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **add** new borrower","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **list** all borrowers","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **edit** an existing borrower","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **find** borrower whose names contain the given keywords","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to **delete** an existing borrower","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to create a **borrow** transaction","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Ty-stan0417"},"content":" * Allows librarian to create a **return** transaction","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Ty-stan0417"},"content":"## Acknowledgement","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"Ty-stan0417"},"content":"* For the detailed documentation of this project, see the **[MyBookshelf Product Website](https://ay2324s2-cs2103t-f11-2.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"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":{"Darkarche3":9,"Ty-stan0417":9,"meowwtama":7,"-":5}},{"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":"jinhanfromNUS"},"content":"### Ho Jin Han","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"jinhanfromNUS"},"content":"\u003cimg src\u003d\"images/jinhanfromnus.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"jinhanfromNUS"},"content":"[[github](http://github.com/jinhanfromNUS)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"jinhanfromNUS"},"content":"[[portfolio](team/jinhanfromNUS.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"jinhanfromNUS"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"jinhanfromNUS"},"content":"* Responsibilities: Features and Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"meowwtama"},"content":"### Khoo Jing Xiang","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"meowwtama"},"content":"\u003cimg src\u003d\"images/meowwtama.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"meowwtama"},"content":"[[github](http://github.com/meowwtama)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"meowwtama"},"content":"[[portfolio](team/meowwtama.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"meowwtama"},"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":"ashleyclx"},"content":"### Ashley Chang","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ashleyclx"},"content":"\u003cimg src\u003d\"images/ashleyclx.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"ashleyclx"},"content":"[[github](http://github.com/ashleyclx)] [[portfolio](team/ashleyclx.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":"ashleyclx"},"content":"* Responsibilities: Features and Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"Ty-stan0417"},"content":"### Tan Yi-Sheng","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"Darkarche3"},"content":"\u003cimg src\u003d\"images/ty-stan0417.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"Ty-stan0417"},"content":"[[github](http://github.com/Ty-stan0417)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"Ty-stan0417"},"content":"[[portfolio](team/Ty-stan0417.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"Ty-stan0417"},"content":"* Responsibilities: Features and Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"Darkarche3"},"content":"### Shenoy Suraj Bantwal","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"Darkarche3"},"content":"\u003cimg src\u003d\"images/darkarche3.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Darkarche3"},"content":"[[github](https://github.com/Darkarche3)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"Darkarche3"},"content":"[[portfolio](team/Darkarche3.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Darkarche3"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Darkarche3":6,"Ty-stan0417":4,"ashleyclx":4,"jinhanfromNUS":6,"meowwtama":5,"-":34}},{"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":"Darkarche3"},"content":"* needs to keep track of which borrower borrowed which book","lastModifiedDate":"2024-03-08"},{"lineNumber":271,"author":{"gitId":"Darkarche3"},"content":"* needs to keep track of which borrower returned which book","lastModifiedDate":"2024-03-08"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"Darkarche3"},"content":"**Value proposition**: manage borrowers and keepts track of borrowing and returning of books faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-08"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"jinhanfromNUS"},"content":"| -------- | ---------- | ------------------------------------------------ | -------------------------------------------------------------------------------- |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record the phone number of the borrower | send SMS reminders to notify them that someone else is looking for the book |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record the email address of the borrower | send an email reminders to notify them that someone else is looking for the book |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record the postal address of the borrower | send a warning letter when breach community guidelines |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record how many books the borrower has borrowed | keep track the position of the books |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"jinhanfromNUS"},"content":"| `* * *` | libarian | record the date the borrower borrowed the book | calculate when they need to return the book |","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"Ty-stan0417"},"content":"(For all use cases below, the **System** is the `MyBookshelf` and the **Actor** is the `librarian`, unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"Ty-stan0417"},"content":"**Use case: Borrower borrows a book from the library**","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"Ty-stan0417"},"content":"1. Borrower requests to borrow a book.","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"Ty-stan0417"},"content":"2. Librarian requests to list borrowers.","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"Ty-stan0417"},"content":"3. MyBookshelf shows a list of borrowers.","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"Ty-stan0417"},"content":"4. Librarian adds the book to the borrower.","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"Ty-stan0417"},"content":"5. MyBookshelf updates the borrower\u0027s details.","lastModifiedDate":"2024-03-07"},{"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":"Ty-stan0417"},"content":"* 4a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"Ty-stan0417"},"content":" * 4a1. MyBookshelf shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"Ty-stan0417"},"content":" Use case resumes at step 3.","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"meowwtama"},"content":"**Use case: Borrower returns a book to the library**","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"meowwtama"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"meowwtama"},"content":"1. Borrower requests to return a book.","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"meowwtama"},"content":"2. Librarian requests to list borrowers.","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"meowwtama"},"content":"3. MyBookshelf shows a list of borrowers.","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"meowwtama"},"content":"4. Librarian removes the book from the borrower.","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"meowwtama"},"content":"5. MyBookshelf updates the borrower\u0027s details. ","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"meowwtama"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"meowwtama"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"meowwtama"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"meowwtama"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"meowwtama"},"content":"* 4a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"meowwtama"},"content":" * 4a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"meowwtama"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"meowwtama"},"content":" Use case resumes at step 3.","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"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":350,"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":351,"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":352,"author":{"gitId":"Darkarche3"},"content":"4. Should be easy to use and fast to learn for users who are new to this application.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"Darkarche3"},"content":"5. Response time should be fast enough that it does not take the user a long time to use it.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"Darkarche3"},"content":"6. Should be easy to recognise and remember necessary commands to minimise need for user to check what command to use.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":361,"author":{"gitId":"ashleyclx"},"content":"* **Librarian**: Main target user of My Bookshelf (community library manager)","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"ashleyclx"},"content":"* **Borrower**: People who borrow books from library that we need to keep track of contact details","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"ashleyclx"},"content":"* **Book**: Contains details relating to book lent to the Borrower","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"ashleyclx"},"content":"* **Borrow**: Borrower takes a book from the community library","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"ashleyclx"},"content":"* **Return**: Borrower gives back the book they borrowed to the community library","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"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":"\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":374,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"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":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"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":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"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":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"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":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"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":408,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Darkarche3":6,"Ty-stan0417":10,"ashleyclx":5,"jinhanfromNUS":6,"meowwtama":24,"-":367}},{"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":"ashleyclx"},"content":"My Bookshelf is a **desktop app for librarians managing contacts and borrowing status of borrowers of books, 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, My Bookshelf can get your contact and borrowing management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"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":"-"},"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":" * `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":"ashleyclx"},"content":"### Adding a borrower: `add`","lastModifiedDate":"2024-03-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"ashleyclx"},"content":"Adds a borrower to the address book.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"A borrower can have any number of tags (including 0)","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Listing all borrowers : `list`","lastModifiedDate":"2024-03-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"ashleyclx"},"content":"Shows a list of all borrowers in the address book.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Editing a borrower : `edit`","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"ashleyclx"},"content":"Edits an existing borrowers in the address book.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* Edits the borrower at the specified `INDEX`. The index refers to the index number shown in the displayed borrower list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* When editing tags, the existing tags of the borrower will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-03-07"},{"lineNumber":105,"author":{"gitId":"ashleyclx"},"content":"* You can remove all the borrower’s tags by typing `t/` without","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st borrower to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Locating borrowers by name: `find`","lastModifiedDate":"2024-03-07"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"ashleyclx"},"content":"Finds borrowers whose names contain any of the given keywords.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* Borrowers matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Deleting a borrower : `delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"ashleyclx"},"content":"Deletes the specified borrrower from the address book.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* Deletes the borrrower at the specified `INDEX`.","lastModifiedDate":"2024-03-07"},{"lineNumber":137,"author":{"gitId":"ashleyclx"},"content":"* The index refers to the index number shown in the displayed borrower list.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"* `list` followed by `delete 2` deletes the 2nd borrrower in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"ashleyclx"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st borrrower in the results of the `find` command.","lastModifiedDate":"2024-03-07"},{"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":"ashleyclx"},"content":"### Borrow a book by a borrower: `borrow`","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"ashleyclx"},"content":"Description","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"ashleyclx"},"content":"Format: ``","lastModifiedDate":"2024-03-07"},{"lineNumber":161,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"ashleyclx"},"content":"### Return a book from a borrower : `return`","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"ashleyclx"},"content":"Description","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"ashleyclx"},"content":"Format: ``","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":168,"author":{"gitId":"ashleyclx"},"content":"### Donate a book from a borrower : `donate`","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"ashleyclx"},"content":"Description","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"ashleyclx"},"content":"Format: ``","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":174,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"ashleyclx"},"content":"My Bookshelf 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-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":180,"author":{"gitId":"ashleyclx"},"content":"My Bookshelf 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-07"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":182,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":183,"author":{"gitId":"ashleyclx"},"content":"If your changes to the data file makes its format invalid, My Bookshelf 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-07"},{"lineNumber":184,"author":{"gitId":"ashleyclx"},"content":"Furthermore, certain edits can cause the My Bookshelf 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-07"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"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":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":202,"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":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":204,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":206,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"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":211,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"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":214,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"ashleyclx"},"content":"**Borrow**","lastModifiedDate":"2024-03-07"},{"lineNumber":218,"author":{"gitId":"ashleyclx"},"content":"**Return**","lastModifiedDate":"2024-03-07"},{"lineNumber":219,"author":{"gitId":"ashleyclx"},"content":"**Donate**","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"ashleyclx":46,"-":173}},{"path":"docs/team/Darkarche3.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Darkarche3"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Darkarche3"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Darkarche3"},"content":"title: Suraj\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Darkarche3"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Darkarche3"},"content":"### Project: My Bookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Darkarche3"},"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":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Darkarche3"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Darkarche3"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Darkarche3"},"content":" * What it does:","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Darkarche3"},"content":" * Justification:","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Darkarche3"},"content":" * Highlights:","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Darkarche3"},"content":" * Credits:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Darkarche3"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Darkarche3"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Darkarche3"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Darkarche3"},"content":" * Managed releases `v0.0` - `v0.0rc` (0 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Darkarche3"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"Darkarche3"},"content":" * Not done yet (Pull Requests: [#5](), [#12](), [#13](), [#15]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"Darkarche3"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Darkarche3"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Darkarche3"},"content":" * Change Ui.png","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Darkarche3"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Darkarche3"},"content":" * Add user stories","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"Darkarche3"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"Darkarche3"},"content":" * PRs reviewed (with non-trivial review comments): [\\#1](), [\\#18]()","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"Darkarche3"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"Darkarche3"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"Darkarche3"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"Darkarche3"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"Darkarche3"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"Darkarche3"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Darkarche3":41}},{"path":"docs/team/Ty-stan0417.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Ty-stan0417"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Ty-stan0417"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Ty-stan0417"},"content":"title: Yi-Sheng\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Ty-stan0417"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Ty-stan0417"},"content":"### Project: My Bookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Ty-stan0417"},"content":"MyBookshelf is a desktop application used for managing books. 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":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Ty-stan0417"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Ty-stan0417"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Ty-stan0417"},"content":" * What it does:","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"Ty-stan0417"},"content":" * Justification:","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"Ty-stan0417"},"content":" * Highlights:","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"Ty-stan0417"},"content":" * Credits:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Ty-stan0417"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Ty-stan0417"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Ty-stan0417"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Ty-stan0417"},"content":" * Managed releases `v0.0` - `v0.0rc` (0 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Ty-stan0417"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet (Pull requests [\\#21](), [\\#21]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Ty-stan0417"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Ty-stan0417"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Ty-stan0417"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"Ty-stan0417"},"content":" * Added to Use Cases [\\#16]()","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"Ty-stan0417"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"Ty-stan0417"},"content":" * PRs reviewed (with non-trivial review comments): [\\#18]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"Ty-stan0417"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"Ty-stan0417"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"Ty-stan0417"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"Ty-stan0417"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Ty-stan0417":46}},{"path":"docs/team/ashleyclx.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ashleyclx"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"ashleyclx"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"ashleyclx"},"content":"title: Ashley Chang\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"ashleyclx"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"ashleyclx"},"content":"### Project: My Bookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"ashleyclx"},"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":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"ashleyclx"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"ashleyclx"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"ashleyclx"},"content":" * What it does:","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"ashleyclx"},"content":" * Justification:","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"ashleyclx"},"content":" * Highlights:","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"ashleyclx"},"content":" * Credits:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"ashleyclx"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"ashleyclx"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"ashleyclx"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"ashleyclx"},"content":" * Managed releases `v0.0` - `v0.0rc` (0 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"ashleyclx"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"ashleyclx"},"content":" * Not done yet (Pull requests [\\#19](), [\\#19]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"ashleyclx"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"ashleyclx"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"ashleyclx"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"ashleyclx"},"content":" * Added to Glossary [\\#14]()","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"ashleyclx"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"ashleyclx"},"content":" * PRs reviewed (with non-trivial review comments): [\\#19]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"ashleyclx"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"ashleyclx"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"ashleyclx"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"ashleyclx"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"ashleyclx":46}},{"path":"docs/team/jinhanfromNUS.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jinhanfromNUS"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"jinhanfromNUS"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"jinhanfromNUS"},"content":"title: Jin Han\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"jinhanfromNUS"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"jinhanfromNUS"},"content":"### Project: My Bookshelf","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"jinhanfromNUS"},"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":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"jinhanfromNUS"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"jinhanfromNUS"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"jinhanfromNUS"},"content":" * What it does:","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"jinhanfromNUS"},"content":" * Justification:","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"jinhanfromNUS"},"content":" * Highlights:","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"jinhanfromNUS"},"content":" * Credits:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"jinhanfromNUS"},"content":"* **New Feature**: Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"jinhanfromNUS"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"jinhanfromNUS"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"jinhanfromNUS"},"content":" * Managed releases `v0.0` - `v0.0rc` (0 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"jinhanfromNUS"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"jinhanfromNUS"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"jinhanfromNUS"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"jinhanfromNUS"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"jinhanfromNUS"},"content":" * Change Ui.png","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"jinhanfromNUS"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"jinhanfromNUS"},"content":" * Add user stories","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"jinhanfromNUS"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"jinhanfromNUS"},"content":" * PRs reviewed (with non-trivial review comments): [\\#1](), [\\#18]()","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"jinhanfromNUS"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"jinhanfromNUS"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"jinhanfromNUS"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"jinhanfromNUS"},"content":" * Not done yet","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"jinhanfromNUS"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"jinhanfromNUS"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"jinhanfromNUS":41}},{"path":"docs/team/meowwtama.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":"meowwtama"},"content":"title: Khoo Jing Xiang\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":{"meowwtama":1,"-":45}}] diff --git a/AY2324S2-CS2103T-F11-2_tp_master/commits.json b/AY2324S2-CS2103T-F11-2_tp_master/commits.json index 3e27ed4f..dbacd25f 100644 --- a/AY2324S2-CS2103T-F11-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-F11-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Darkarche3":[{"date":"2024-03-07","commitResults":[{"hash":"2a75a0f78b116de9b7cc9364d18ef57d35777d01","isMergeCommit":false,"messageTitle":"update ReadMe.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":1}}},{"hash":"d1ed5495f7ec1c19e1b2c7dff458ca15b00d5ff7","isMergeCommit":false,"messageTitle":"update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":47,"deletions":6}}},{"hash":"5ad5d020ee7782e4e41831fd57a682d2a3767dfa","isMergeCommit":false,"messageTitle":"update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":0}}},{"hash":"e76e3dc021ff746dc6bf0fb0746d6789a1adfb7b","isMergeCommit":true,"messageTitle":"Merge pull request #34 from jinhanfromNUS/jinhanfromNUS-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"8500e70fbcffe68fbfc429ee4b4fe967412fe83a","isMergeCommit":true,"messageTitle":"Merge pull request #35 from meowwtama/branch-AboutUs","messageBody":"Update meowwtama.md","fileTypesAndContributionMap":{}},{"hash":"6ece8eb8d7dfdc2d09857b6bc780ec15186ad294","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"da720fe0e0299fa7e8929bbe088d2dabb255d403","isMergeCommit":true,"messageTitle":"Merge pull request #36 from Ty-stan0417/branch-Rename","messageBody":"Rename photo file name","fileTypesAndContributionMap":{}},{"hash":"8b2f015a8ab9c91fd1d01a688d99ab1f27c140d4","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F11-2:master\u0027 into branch-update-BuildStatusBadge","messageBody":"","fileTypesAndContributionMap":{}}]}],"Ty-stan0417":[{"date":"2024-03-07","commitResults":[{"hash":"2a81328e1f2e0379b1db503abf76cdd24a7f30c8","isMergeCommit":false,"messageTitle":"Update use cases in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":9}}},{"hash":"fc8a8f5d8f28e3064473320e129e623111bcbb86","isMergeCommit":true,"messageTitle":"Merge pull request #24 from jinhanfromNUS/branch-About-Us","messageBody":"Upload About Us image and add log","fileTypesAndContributionMap":{}},{"hash":"997881865dc39058598444943e2a99e4047a4e02","isMergeCommit":false,"messageTitle":"Update About Us Yi-Sheng","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"8c2aad7cb1acd58479089998b608c7055ed4b8cb","isMergeCommit":true,"messageTitle":"Merge pull request #28 from ashleyclx/branch-UserGuide1","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"6d07d94fd098e8cc587f0724af68c586a612d2ed","isMergeCommit":false,"messageTitle":"Update app details and example usage in README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":2}}},{"hash":"6ad75ed05fbc6e4065aa0cb0c80d44a288b28034","isMergeCommit":false,"messageTitle":"Update Acknowledgement in README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":4}}},{"hash":"f8ba5670d64e5879b1ff73e0dca4c4235a9a8f00","isMergeCommit":false,"messageTitle":"Rename photo file name","messageBody":"Remove sample from AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":10}}}]}],"ashleyclx":[{"date":"2024-03-06","commitResults":[{"hash":"bf43d3d4280f4790da2ce2fa91f853b7c8d8d417","isMergeCommit":false,"messageTitle":"Update Glossary in Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"e419e5647c8c531140a62552017fc70a0b71dd2b","isMergeCommit":false,"messageTitle":"Update Ashley details in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}},{"hash":"547917ef57decc071adbfd1efaca3f907fccd3f8","isMergeCommit":false,"messageTitle":"Update ashleyclx.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":17}}},{"hash":"ce400b725660e5bc44388b8d4d4531440997f04e","isMergeCommit":true,"messageTitle":"Merge pull request #26 from meowwtama/branch-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"b495bc155f873cad656cb8300363a3a0fcdd882d","isMergeCommit":true,"messageTitle":"Merge pull request #27 from meowwtama/branch-AboutREADME","messageBody":"Update About section in README.md","fileTypesAndContributionMap":{}},{"hash":"aa7b8889a46f5305a0c09da8addbeb57cb1d2a11","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"* Updated terms used, like AB3 to My Bookshelf, person to borrower\r\n* Added sections for borrow, return and donate (to be filled after development)","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":25}}}]}],"jinhanfromNUS":[{"date":"2024-02-27","commitResults":[{"hash":"85b79600f97387922e2dd07232759ec38abe9924","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Update README.md to be accepted in pr","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-06","commitResults":[{"hash":"dae276fb50893a924f21367e79df5ac2b6100302","isMergeCommit":true,"messageTitle":"Merge pull request #18 from ashleyclx/branch-UpdateDgGlossary","messageBody":"Update Glossary in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"e116469631ee7d16675f1ede3d2674b123e04cef","isMergeCommit":true,"messageTitle":"Merge pull request #19 from jinhanfromNUS/branch-updateUi","messageBody":"Change Ui.png","fileTypesAndContributionMap":{}},{"hash":"add1314b1b647b66613f5c9696d08b5629601c7c","isMergeCommit":false,"messageTitle":"Update DeveloperGuide v1.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":6}}},{"hash":"7a3bce66a36063123aa5c5c6f19d72b89664ba17","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":13}}}]},{"date":"2024-03-07","commitResults":[{"hash":"9b430ef40762b68dfb732eadcf9340bef65cf1b2","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"7e8920f6aaf87a1ab42446494350d3212cbb3e0a","isMergeCommit":true,"messageTitle":"Merge pull request #20 from jinhanfromNUS/branch-updateDeveloperGuide","messageBody":"Update user stories of developer guide","fileTypesAndContributionMap":{}},{"hash":"788ad7b296fe1d6a94dd3f46c5b279077ab8ab0e","isMergeCommit":true,"messageTitle":"Merge pull request #22 from ashleyclx/branch-AboutUsAshley","messageBody":"Update About Us Ashley","fileTypesAndContributionMap":{}},{"hash":"c33c5209e49892471b32ba5c45872854ced29c0f","isMergeCommit":true,"messageTitle":"Merge pull request #23 from meowwtama/branch-UseCases","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"d31d0524e9f251e59a31ab7b271367a9c6b17406","isMergeCommit":false,"messageTitle":"Upload About Us image and add log","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":41,"deletions":0}}},{"hash":"b853a8a26c587aee821fa008480e07609370ad36","isMergeCommit":true,"messageTitle":"Merge pull request #25 from Ty-stan0417/branch-AboutUs","messageBody":"Update About Us Yi-Sheng","fileTypesAndContributionMap":{}},{"hash":"ed88695ce6ba4ef6f114ad64d92d39e8f27c0f07","isMergeCommit":true,"messageTitle":"Merge pull request #31 from Darkarche3/branch-update-README","messageBody":"update README.md","fileTypesAndContributionMap":{}},{"hash":"547661f8dc3d6170fb21c90a0a6275e5cdb239c2","isMergeCommit":true,"messageTitle":"Merge pull request #33 from Darkarche3/branch-update-DG","messageBody":"update DG","fileTypesAndContributionMap":{}},{"hash":"a009d1a756be2b7c7e9d890b254c7c27607279a2","isMergeCommit":true,"messageTitle":"Merge pull request #32 from Darkarche3/branch-update-AboutUs","messageBody":"update AboutUs","fileTypesAndContributionMap":{}},{"hash":"8334e48dbdb675d3137e978068660972955250bf","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}}]}],"meowwtama":[{"date":"2024-03-07","commitResults":[{"hash":"f1f8769d4fa39bb4ff6e7378527b7853685bfc02","isMergeCommit":true,"messageTitle":"Merge pull request #21 from Ty-stan0417/branch-UseCases","messageBody":"Update use cases in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"577766438fc73dd37d89a384461aefb23d361801","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":0}}},{"hash":"06d9c417a97c6cbaede4830e9afbd0822cb1651c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Added personal updates to the AboutUs page.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"163d2b33da587a258b727e833509a0f8803562e3","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-AboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1ee15cdcb30de32ff27eea633e8268f9fe96870b","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"9ae1c252c584526e47bf557e76767626c2af8b77","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Ty-stan0417/branch-ExampleUsage","messageBody":"Update app details and example usage in README.md","fileTypesAndContributionMap":{}},{"hash":"8a9553b513c43f6705dca0cae8a0b7dcca173667","isMergeCommit":true,"messageTitle":"Merge pull request #30 from Ty-stan0417/branch-Acknowlegment","messageBody":"Update Acknowledgement in README.md","fileTypesAndContributionMap":{}},{"hash":"7a82458583e001831aebe113da40390cd39101a3","isMergeCommit":false,"messageTitle":"Update meowwtama.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"34fe67302228362bacf41154d784fe10faf4049b","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Darkarche3/branch-update-BuildStatusBadge","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Darkarche3":{"docs":57,"functional-code":0,"test-code":0},"Ty-stan0417":{"docs":69,"functional-code":0,"test-code":0},"ashleyclx":{"docs":101,"functional-code":0,"test-code":0},"jinhanfromNUS":{"docs":53,"functional-code":0,"test-code":0},"meowwtama":{"docs":37,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Darkarche3":280.22958,"Ty-stan0417":717.3877,"ashleyclx":1669.454,"jinhanfromNUS":344.6735,"meowwtama":215.49489},"authorDisplayNameMap":{"Darkarche3":"CS2103T-F11-2 SHEN..TWAL","Ty-stan0417":"CS2103T-F11-2 TAN ..HENG","ashleyclx":"CS2103T-F11-2 ASHL..XUAN","jinhanfromNUS":"CS2103T-F11-2 HO J.. HAN","meowwtama":"CS2103T-F11-2 KHOO..IANG"}} +{"authorDailyContributionsMap":{"Darkarche3":[{"date":"2024-03-07","commitResults":[{"hash":"2a75a0f78b116de9b7cc9364d18ef57d35777d01","isMergeCommit":false,"messageTitle":"update ReadMe.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":1}}},{"hash":"d1ed5495f7ec1c19e1b2c7dff458ca15b00d5ff7","isMergeCommit":false,"messageTitle":"update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":47,"deletions":6}}},{"hash":"5ad5d020ee7782e4e41831fd57a682d2a3767dfa","isMergeCommit":false,"messageTitle":"update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":0}}},{"hash":"e76e3dc021ff746dc6bf0fb0746d6789a1adfb7b","isMergeCommit":true,"messageTitle":"Merge pull request #34 from jinhanfromNUS/jinhanfromNUS-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"8500e70fbcffe68fbfc429ee4b4fe967412fe83a","isMergeCommit":true,"messageTitle":"Merge pull request #35 from meowwtama/branch-AboutUs","messageBody":"Update meowwtama.md","fileTypesAndContributionMap":{}},{"hash":"6ece8eb8d7dfdc2d09857b6bc780ec15186ad294","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"da720fe0e0299fa7e8929bbe088d2dabb255d403","isMergeCommit":true,"messageTitle":"Merge pull request #36 from Ty-stan0417/branch-Rename","messageBody":"Rename photo file name","fileTypesAndContributionMap":{}},{"hash":"8b2f015a8ab9c91fd1d01a688d99ab1f27c140d4","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F11-2:master\u0027 into branch-update-BuildStatusBadge","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"01af68bdfeeb7424e1b5bc03ccf8f26023833984","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-08","commitResults":[{"hash":"06c9b6630cf91b8450e6e8058f4ac68fa789f3f4","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}},{"hash":"37311b238ebe530b9cec1726af14eae0c68e3166","isMergeCommit":true,"messageTitle":"Merge pull request #40 from Darkarche3/branch-update-DG-ProductScope","messageBody":"Update DG","fileTypesAndContributionMap":{}},{"hash":"91f2814e9b350354676182064debed773d65f18c","isMergeCommit":true,"messageTitle":"Merge pull request #41 from jinhanfromNUS/branch-UpdateConfigYml","messageBody":"Update _config.yml","fileTypesAndContributionMap":{}}]}],"Ty-stan0417":[{"date":"2024-03-07","commitResults":[{"hash":"2a81328e1f2e0379b1db503abf76cdd24a7f30c8","isMergeCommit":false,"messageTitle":"Update use cases in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":9}}},{"hash":"fc8a8f5d8f28e3064473320e129e623111bcbb86","isMergeCommit":true,"messageTitle":"Merge pull request #24 from jinhanfromNUS/branch-About-Us","messageBody":"Upload About Us image and add log","fileTypesAndContributionMap":{}},{"hash":"997881865dc39058598444943e2a99e4047a4e02","isMergeCommit":false,"messageTitle":"Update About Us Yi-Sheng","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"8c2aad7cb1acd58479089998b608c7055ed4b8cb","isMergeCommit":true,"messageTitle":"Merge pull request #28 from ashleyclx/branch-UserGuide1","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"6d07d94fd098e8cc587f0724af68c586a612d2ed","isMergeCommit":false,"messageTitle":"Update app details and example usage in README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":2}}},{"hash":"6ad75ed05fbc6e4065aa0cb0c80d44a288b28034","isMergeCommit":false,"messageTitle":"Update Acknowledgement in README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":4}}},{"hash":"f8ba5670d64e5879b1ff73e0dca4c4235a9a8f00","isMergeCommit":false,"messageTitle":"Rename photo file name","messageBody":"Remove sample from AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":10}}}]}],"ashleyclx":[{"date":"2024-03-06","commitResults":[{"hash":"bf43d3d4280f4790da2ce2fa91f853b7c8d8d417","isMergeCommit":false,"messageTitle":"Update Glossary in Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"e419e5647c8c531140a62552017fc70a0b71dd2b","isMergeCommit":false,"messageTitle":"Update Ashley details in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}},{"hash":"547917ef57decc071adbfd1efaca3f907fccd3f8","isMergeCommit":false,"messageTitle":"Update ashleyclx.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":17}}},{"hash":"ce400b725660e5bc44388b8d4d4531440997f04e","isMergeCommit":true,"messageTitle":"Merge pull request #26 from meowwtama/branch-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"b495bc155f873cad656cb8300363a3a0fcdd882d","isMergeCommit":true,"messageTitle":"Merge pull request #27 from meowwtama/branch-AboutREADME","messageBody":"Update About section in README.md","fileTypesAndContributionMap":{}},{"hash":"aa7b8889a46f5305a0c09da8addbeb57cb1d2a11","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"* Updated terms used, like AB3 to My Bookshelf, person to borrower\r\n* Added sections for borrow, return and donate (to be filled after development)","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":25}}}]}],"jinhanfromNUS":[{"date":"2024-02-27","commitResults":[{"hash":"85b79600f97387922e2dd07232759ec38abe9924","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Update README.md to be accepted in pr","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-06","commitResults":[{"hash":"dae276fb50893a924f21367e79df5ac2b6100302","isMergeCommit":true,"messageTitle":"Merge pull request #18 from ashleyclx/branch-UpdateDgGlossary","messageBody":"Update Glossary in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"e116469631ee7d16675f1ede3d2674b123e04cef","isMergeCommit":true,"messageTitle":"Merge pull request #19 from jinhanfromNUS/branch-updateUi","messageBody":"Change Ui.png","fileTypesAndContributionMap":{}},{"hash":"add1314b1b647b66613f5c9696d08b5629601c7c","isMergeCommit":false,"messageTitle":"Update DeveloperGuide v1.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":6}}},{"hash":"7a3bce66a36063123aa5c5c6f19d72b89664ba17","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":13}}}]},{"date":"2024-03-07","commitResults":[{"hash":"9b430ef40762b68dfb732eadcf9340bef65cf1b2","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"7e8920f6aaf87a1ab42446494350d3212cbb3e0a","isMergeCommit":true,"messageTitle":"Merge pull request #20 from jinhanfromNUS/branch-updateDeveloperGuide","messageBody":"Update user stories of developer guide","fileTypesAndContributionMap":{}},{"hash":"788ad7b296fe1d6a94dd3f46c5b279077ab8ab0e","isMergeCommit":true,"messageTitle":"Merge pull request #22 from ashleyclx/branch-AboutUsAshley","messageBody":"Update About Us Ashley","fileTypesAndContributionMap":{}},{"hash":"c33c5209e49892471b32ba5c45872854ced29c0f","isMergeCommit":true,"messageTitle":"Merge pull request #23 from meowwtama/branch-UseCases","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"d31d0524e9f251e59a31ab7b271367a9c6b17406","isMergeCommit":false,"messageTitle":"Upload About Us image and add log","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":41,"deletions":0}}},{"hash":"b853a8a26c587aee821fa008480e07609370ad36","isMergeCommit":true,"messageTitle":"Merge pull request #25 from Ty-stan0417/branch-AboutUs","messageBody":"Update About Us Yi-Sheng","fileTypesAndContributionMap":{}},{"hash":"ed88695ce6ba4ef6f114ad64d92d39e8f27c0f07","isMergeCommit":true,"messageTitle":"Merge pull request #31 from Darkarche3/branch-update-README","messageBody":"update README.md","fileTypesAndContributionMap":{}},{"hash":"547661f8dc3d6170fb21c90a0a6275e5cdb239c2","isMergeCommit":true,"messageTitle":"Merge pull request #33 from Darkarche3/branch-update-DG","messageBody":"update DG","fileTypesAndContributionMap":{}},{"hash":"a009d1a756be2b7c7e9d890b254c7c27607279a2","isMergeCommit":true,"messageTitle":"Merge pull request #32 from Darkarche3/branch-update-AboutUs","messageBody":"update AboutUs","fileTypesAndContributionMap":{}},{"hash":"8334e48dbdb675d3137e978068660972955250bf","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"c1b164b42f1097bb2ab051aee3ec3dc00b64d549","isMergeCommit":true,"messageTitle":"Merge pull request #39 from Darkarche3/branch-update-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"meowwtama":[{"date":"2024-03-07","commitResults":[{"hash":"f1f8769d4fa39bb4ff6e7378527b7853685bfc02","isMergeCommit":true,"messageTitle":"Merge pull request #21 from Ty-stan0417/branch-UseCases","messageBody":"Update use cases in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"577766438fc73dd37d89a384461aefb23d361801","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":0}}},{"hash":"06d9c417a97c6cbaede4830e9afbd0822cb1651c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Added personal updates to the AboutUs page.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"163d2b33da587a258b727e833509a0f8803562e3","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-AboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1ee15cdcb30de32ff27eea633e8268f9fe96870b","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"9ae1c252c584526e47bf557e76767626c2af8b77","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Ty-stan0417/branch-ExampleUsage","messageBody":"Update app details and example usage in README.md","fileTypesAndContributionMap":{}},{"hash":"8a9553b513c43f6705dca0cae8a0b7dcca173667","isMergeCommit":true,"messageTitle":"Merge pull request #30 from Ty-stan0417/branch-Acknowlegment","messageBody":"Update Acknowledgement in README.md","fileTypesAndContributionMap":{}},{"hash":"7a82458583e001831aebe113da40390cd39101a3","isMergeCommit":false,"messageTitle":"Update meowwtama.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"34fe67302228362bacf41154d784fe10faf4049b","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Darkarche3/branch-update-BuildStatusBadge","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Darkarche3":{"docs":62,"functional-code":0,"test-code":0},"Ty-stan0417":{"docs":69,"functional-code":0,"test-code":0},"ashleyclx":{"docs":101,"functional-code":0,"test-code":0},"jinhanfromNUS":{"docs":53,"functional-code":0,"test-code":0},"meowwtama":{"docs":37,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Darkarche3":277.92886,"Ty-stan0417":672.99554,"ashleyclx":1566.8,"jinhanfromNUS":325.12888,"meowwtama":202.16},"authorDisplayNameMap":{"Darkarche3":"CS2103T-F11-2 SHEN..TWAL","Ty-stan0417":"CS2103T-F11-2 TAN ..HENG","ashleyclx":"CS2103T-F11-2 ASHL..XUAN","jinhanfromNUS":"CS2103T-F11-2 HO J.. HAN","meowwtama":"CS2103T-F11-2 KHOO..IANG"}} diff --git a/AY2324S2-CS2103T-F12-2_tp_master/authorship.json b/AY2324S2-CS2103T-F12-2_tp_master/authorship.json index 755ce3cb..74dd62bb 100644 --- a/AY2324S2-CS2103T-F12-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F12-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Murugan-Maniish"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103T-F12-2/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-F12-2/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-06"},{"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":"Murugan-Maniish"},"content":"An app named Press Planner for freelance journalists that can streamline their workflow by organizing sources, tracking outlets interested in their stories, and managing collaborations with peers/editors. With features like tagging and grouping contacts, it facilitates efficient research, ensuring reporters can quickly reach out and report on breaking stories. It is 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, the CLI can be faster than the GUI.","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Murugan-Maniish"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Murugan-Maniish"},"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":{"Murugan-Maniish":4,"-":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":"Murugan-Maniish"},"content":"### Aung Ko Khant","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/ko-khan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/Ko-Khan)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"Murugan-Maniish"},"content":"* Responsibilities: Data","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"Murugan-Maniish"},"content":"### Benny Loh Choon Keong","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/bennylck.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/bennyLCK)]","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Murugan-Maniish"},"content":"### Hamish Stewart Dawe","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/h4mes.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/H4mes)]","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Murugan-Maniish"},"content":"### Hyun Eunkyu","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/howlong11.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/Howlong11)]","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"Murugan-Maniish"},"content":"### Murugan Maniish","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/murugan-maniish.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/Murugan-Maniish)]","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Murugan-Maniish":16,"-":39}},{"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":"Howlong11"},"content":"* freelance journalists","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"Howlong11"},"content":"* has a need to manage a significant number of contacts for different facets of business","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"Howlong11"},"content":"* prefer using text-based commands than multi-step GUI","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"Howlong11"},"content":"* value speed and efficiency","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"Howlong11"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"Howlong11"},"content":"**Value proposition**: An app for freelance journalists that can streamline their workflow by organizing sources, tracking outlets interested in their stories, and managing collaborations with peers/editors. With features like tagging and grouping contacts, it facilitates efficient research, ensuring reporters can quickly reach out and report on breaking stories.","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"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":297,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"Ko-Khan"},"content":"(For all use cases below, the **System** is the `PressPlanner` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"bennyLCK"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"Ko-Khan"},"content":"**Use case: UC01 - Add an article**","lastModifiedDate":"2024-03-05"},{"lineNumber":332,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":333,"author":{"gitId":"Ko-Khan"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"Ko-Khan"},"content":"1. User requests to add article","lastModifiedDate":"2024-03-05"},{"lineNumber":335,"author":{"gitId":"Ko-Khan"},"content":"2. PressPlanner adds article","lastModifiedDate":"2024-03-05"},{"lineNumber":336,"author":{"gitId":"Ko-Khan"},"content":"3. PressPlanner displays success message to User.","lastModifiedDate":"2024-03-05"},{"lineNumber":337,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"Ko-Khan"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"bennyLCK"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"Ko-Khan"},"content":"* 1a. Command was invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"Ko-Khan"},"content":" * 1a1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"Ko-Khan"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"bennyLCK"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"Ko-Khan"},"content":"**Use case: UC02 - List all articles**","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"Ko-Khan"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"Ko-Khan"},"content":"1. User requests to list articles","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"Ko-Khan"},"content":"2. PressPlanner lists out all articles","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"Ko-Khan"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"Ko-Khan"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"Ko-Khan"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"bennyLCK"},"content":" * 1a1. PressPlanner returns an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"bennyLCK"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"bennyLCK"},"content":"**Use case: UC03 - Edit an article**","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"bennyLCK"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"bennyLCK"},"content":"1. User requests to list articles","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner shows a list of articles","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"bennyLCK"},"content":"1. User requests to edit a specific article in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"bennyLCK"},"content":" by providing at least one change to an attribute of the article","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner updates the article with the changes requested","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner shows the updated article to user","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"bennyLCK"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"bennyLCK"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"bennyLCK"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"bennyLCK"},"content":" * 3a1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"bennyLCK"},"content":"* 3b. No changes to an attribute of the article is specified.","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"bennyLCK"},"content":" * 3b1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"bennyLCK"},"content":"**Use case: UC04 - Delete an article**","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"bennyLCK"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"bennyLCK"},"content":"1. User requests to list articles","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner shows a list of articles","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"bennyLCK"},"content":"1. User requests to delete a specific article in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner deletes the article ","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner shows delete success message to user","lastModifiedDate":"2024-03-06"},{"lineNumber":404,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"bennyLCK"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":406,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"bennyLCK"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"bennyLCK"},"content":"* 2a. A find command is used to find articles with given keywords.","lastModifiedDate":"2024-03-06"},{"lineNumber":410,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"bennyLCK"},"content":" * 2a1. PressPlanner displays a filtered list of articles found.","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"bennyLCK"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"bennyLCK"},"content":" * 3a1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"bennyLCK"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"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":"Howlong11"},"content":"* **Story**: A story written by interviewing the person","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"Howlong11"},"content":"* **Tag**: Additional information about the person on level of how helpful the person was for a journal.","lastModifiedDate":"2024-03-05"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":451,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":452,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"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":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"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":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"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":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"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":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"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":486,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","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"}],"authorContributionMap":{"Ko-Khan":26,"bennyLCK":72,"Howlong11":8,"-":390}},{"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":"Murugan-Maniish"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003ePressPlanner\u003c/a\u003e","lastModifiedDate":"2024-02-26"},{"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":{"Murugan-Maniish":1,"-":66}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Murugan-Maniish"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103T-F12-2/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-F12-2/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-06"},{"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":"Murugan-Maniish"},"content":"An app named Press Planner for freelance journalists that can streamline their workflow by organizing sources, tracking outlets interested in their stories, and managing collaborations with peers/editors. With features like tagging and grouping contacts, it facilitates efficient research, ensuring reporters can quickly reach out and report on breaking stories. It is 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, the CLI can be faster than the GUI.","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Murugan-Maniish"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Murugan-Maniish"},"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":{"Murugan-Maniish":4,"-":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":"Murugan-Maniish"},"content":"### Aung Ko Khant","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/ko-khan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/Ko-Khan)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"Ko-Khan"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"Ko-Khan"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"Murugan-Maniish"},"content":"### Benny Loh Choon Keong","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/bennylck.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/bennyLCK)]","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"Ko-Khan"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Murugan-Maniish"},"content":"### Hamish Stewart Dawe","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/h4mes.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/H4mes)]","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"Ko-Khan"},"content":"* Responsibilities: Deliverables + Deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"Murugan-Maniish"},"content":"### Hyun Eunkyu","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/howlong11.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/Howlong11)]","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"Ko-Khan"},"content":"* Responsibilities: Scheduling + Tracking","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"Murugan-Maniish"},"content":"### Murugan Maniish","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"Murugan-Maniish"},"content":"\u003cimg src\u003d\"images/murugan-maniish.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"Murugan-Maniish"},"content":"[[github](https://github.com/Murugan-Maniish)]","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"Ko-Khan"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Ko-Khan":6,"Murugan-Maniish":15,"-":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":"-"},"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":"Howlong11"},"content":"* freelance journalists","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"Howlong11"},"content":"* has a need to manage a significant number of contacts for different facets of business","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"Howlong11"},"content":"* prefer using text-based commands than multi-step GUI","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"Howlong11"},"content":"* value speed and efficiency","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"Howlong11"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"Howlong11"},"content":"**Value proposition**: An app for freelance journalists that can streamline their workflow by organizing sources, tracking outlets interested in their stories, and managing collaborations with peers/editors. With features like tagging and grouping contacts, it facilitates efficient research, ensuring reporters can quickly reach out and report on breaking stories.","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"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":297,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"Ko-Khan"},"content":"(For all use cases below, the **System** is the `PressPlanner` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"bennyLCK"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"bennyLCK"},"content":"1. AddressBook shows a list of persons.","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"bennyLCK"},"content":"1. User requests to delete a specific person in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"bennyLCK"},"content":"1. AddressBook deletes the person.","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"bennyLCK"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"Ko-Khan"},"content":"**Use case: UC01 - Add an article**","lastModifiedDate":"2024-03-05"},{"lineNumber":333,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"Ko-Khan"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":335,"author":{"gitId":"bennyLCK"},"content":"1. User requests to add article.","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner adds article.","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner displays success message to User.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"Ko-Khan"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"bennyLCK"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"Ko-Khan"},"content":"* 1a. Command was invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"Ko-Khan"},"content":" * 1a1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"Ko-Khan"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"bennyLCK"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"Ko-Khan"},"content":"**Use case: UC02 - List all articles**","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"Ko-Khan"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"bennyLCK"},"content":"1. User requests to list articles.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner lists out all articles.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"Ko-Khan"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"Ko-Khan"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"Ko-Khan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"Ko-Khan"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"bennyLCK"},"content":" * 1a1. PressPlanner returns an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"bennyLCK"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"bennyLCK"},"content":"**Use case: UC03 - Edit an article**","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"bennyLCK"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"bennyLCK"},"content":"1. User requests to list articles.","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner lists out all articles.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"bennyLCK"},"content":"1. User requests to edit a specific article in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"bennyLCK"},"content":" by providing at least one change to an attribute of the article.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner updates the article with the changes requested.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner shows the updated article to user.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"bennyLCK"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"bennyLCK"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"bennyLCK"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"bennyLCK"},"content":" * 3a1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"bennyLCK"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"bennyLCK"},"content":"* 3b. No changes to an attribute of the article is specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"bennyLCK"},"content":" * 3b1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"bennyLCK"},"content":"**Use case: UC04 - Delete an article**","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"bennyLCK"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"bennyLCK"},"content":"1. User requests to list articles.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner lists out all articles.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"bennyLCK"},"content":"1. User requests to delete a specific article in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner deletes the article.","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner shows delete success message to user.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"bennyLCK"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"bennyLCK"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":410,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"bennyLCK"},"content":"* 2a. User requests to find articles with given keywords.","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"bennyLCK"},"content":" * 2a1. PressPlanner displays a filtered list of articles found.","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 3.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"bennyLCK"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"bennyLCK"},"content":" * 3a1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"bennyLCK"},"content":"**Use case: UC05 - Find articles**","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"bennyLCK"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"bennyLCK"},"content":"1. User requests to list articles.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner lists out all articles.","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"bennyLCK"},"content":"1. User requests to find articles with given keywords.","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"bennyLCK"},"content":"1. PressPlanner displays a filtered list of articles found, ","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"bennyLCK"},"content":"each containing at least one of the given keywords.","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"bennyLCK"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"bennyLCK"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"bennyLCK"},"content":"* 3a. No keywords are specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"bennyLCK"},"content":" * 3a1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":444,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":445,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"bennyLCK"},"content":"* 3b. Only invalid keywords are specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"bennyLCK"},"content":" * 3b1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"bennyLCK"},"content":"* 3c. No articles are found with the given keywords.","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"bennyLCK"},"content":" * 3c1. PressPlanner shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"bennyLCK"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":462,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"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":465,"author":{"gitId":"bennyLCK"},"content":"1. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"bennyLCK"},"content":"1. Should be able to hold up to 1000 articles without a noticeable sluggishness in performance for typical usage. ","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"bennyLCK"},"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-07"},{"lineNumber":468,"author":{"gitId":"bennyLCK"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":474,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"Howlong11"},"content":"* **Story**: A story written by interviewing the person","lastModifiedDate":"2024-03-05"},{"lineNumber":476,"author":{"gitId":"Howlong11"},"content":"* **Tag**: Additional information about the person on level of how helpful the person was for a journal.","lastModifiedDate":"2024-03-05"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":486,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":487,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"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":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"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":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"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":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"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":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"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":521,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Ko-Khan":20,"bennyLCK":121,"Howlong11":8,"-":382}},{"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":"Murugan-Maniish"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003ePressPlanner\u003c/a\u003e","lastModifiedDate":"2024-02-26"},{"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":{"Murugan-Maniish":1,"-":66}}] diff --git a/AY2324S2-CS2103T-F12-2_tp_master/commits.json b/AY2324S2-CS2103T-F12-2_tp_master/commits.json index 1400d074..5c046e1f 100644 --- a/AY2324S2-CS2103T-F12-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-F12-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Ko-Khan":[{"date":"2024-03-05","commitResults":[{"hash":"8c829e084381a2fb2ca9a73edf5e3883ddab2da2","isMergeCommit":false,"messageTitle":"Add use cases for adding and listing articles","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"bafd66ce8adfc838638d84502d914eeb56f74ec8","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F12-2:master\u0027 into branch-kk-usecases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3e33198887683e7a6c00188d6cb32645247659d6","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-kk-usecases\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5f4d84abb4aed7f555941c62238b4a46ed4d9123","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-kk-usecases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"aa240a93af3c493470ec40b5734c3a6f485f028a","isMergeCommit":false,"messageTitle":"Fix mistakes for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"29243328e9e1d85d519421d25949c85b6dfc6010","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-kk-usecases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3a53939fe781c1eb5d4e3aa6d104f2764bcd36f2","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/branch-kk-usecases\u0027 into branch-kk-usecases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ac94dcd8b1df8f66ef3cac6daed0a3eaa3f460cc","isMergeCommit":true,"messageTitle":"Merge pull request #16 from bennyLCK/branch-b-UseCases","messageBody":"Add use cases for edit, delete commands","fileTypesAndContributionMap":{}}]}],"Murugan-Maniish":[{"date":"2024-02-26","commitResults":[{"hash":"9b5e0111a97855fdc2ec3a5fef9dfc95b6da4a9f","isMergeCommit":true,"messageTitle":"Merge branch \u0027switch-docs-to-markbind\u0027 of https://github.com/AY2324S2-CS2103T-F12-2/tp","messageBody":"* \u0027switch-docs-to-markbind\u0027 of https://github.com/AY2324S2-CS2103T-F12-2/tp:\n Reduce font size for printing\n Add a Home button in the top NavBar\n Bump MarkBind version\n Migrate docs to MarkBind\n","fileTypesAndContributionMap":{}},{"hash":"08ed9894d47168a27561b5cccfab8d9d14486122","isMergeCommit":false,"messageTitle":"Update the site configs to match fork","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"521fac173a700e38d69e60bd50e97ce279c7f0f2","isMergeCommit":false,"messageTitle":"Update the AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":22}}},{"hash":"95c9050d3e4777a98e4f3c1498f231e3413e1213","isMergeCommit":false,"messageTitle":"Update the README page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":11}}},{"hash":"195de7c7980a569ea7ed61a2c5bac4564b8d1acd","isMergeCommit":false,"messageTitle":"Fix AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"2d6bfaa55b94b901849042956b36070dd12738ed","isMergeCommit":false,"messageTitle":"Add end line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"c77c1e80de7e80630cdf9acf3303557fa98ee092","isMergeCommit":true,"messageTitle":"Merge pull request #15 from Howlong11/master","messageBody":"Edit Developer Guide","fileTypesAndContributionMap":{}}]}],"bennyLCK":[{"date":"2024-03-06","commitResults":[{"hash":"f9f2b0c8460b78ae6b35b5b6e74ab0d7c914aa4c","isMergeCommit":false,"messageTitle":"Add use cases for edit, delete commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":0}}},{"hash":"a8dd1ef57c9d81022e64fa08b8c5f5b87b0ce10d","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Murugan-Maniish/update_project_website","messageBody":"Update project website","fileTypesAndContributionMap":{}},{"hash":"868775f6951b63f0633a75d975a0a0f347e74f45","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-b-UseCases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ef038501c3d4cb3f6f69840e0aeebce0406f1811","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-b-UseCases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a9e06897d245d27b1701e568ec0821d01315adb1","isMergeCommit":true,"messageTitle":"Merge pull request #9 from Ko-Khan/branch-kk-usecases","messageBody":"Add use cases for adding and listing articles","fileTypesAndContributionMap":{}},{"hash":"43892d6f74a163d0a3ef57daa74eaee8547899b9","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-b-UseCases","messageBody":"# Conflicts:\n#\tdocs/DeveloperGuide.md\n","fileTypesAndContributionMap":{}},{"hash":"ab3507cc5152668716d80969086b39d113d502c2","isMergeCommit":false,"messageTitle":"Rectify DG use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]}],"Howlong11":[{"date":"2024-03-05","commitResults":[{"hash":"08a35423b25d20ce39bef1da629310883cde3454","isMergeCommit":false,"messageTitle":"Add Remark command","messageBody":"Remark attribute classes: adds remark to a Person object\n","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":0},"test-code":{"insertions":20,"deletions":0}}},{"hash":"9c07543433eb0761bf98896e727f3453161aecaf","isMergeCommit":false,"messageTitle":"Add Remark command","messageBody":"Remark classes: adds remark to Person objects\n","fileTypesAndContributionMap":{"functional-code":{"insertions":204,"deletions":13},"test-code":{"insertions":190,"deletions":17}}},{"hash":"ca6b0f1fea279cf2320412f2ff7c4affbb4b0eb1","isMergeCommit":false,"messageTitle":"Revert \"Add Remark command\"","messageBody":"This reverts commit 9c07543433eb0761bf98896e727f3453161aecaf.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":13,"deletions":204},"test-code":{"insertions":17,"deletions":190}}},{"hash":"98c11b8075229ac704cb4a1bce55d7f1049ab23d","isMergeCommit":false,"messageTitle":"Edit DG","messageBody":"Edit the original developer guide\u0027s Target user profile, Value proposition, NFR and Glossary\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":5}}}]},{"date":"2024-03-06","commitResults":[{"hash":"754159ea78479c251d01d77f5935c94e31fee177","isMergeCommit":false,"messageTitle":"Delete wrong files","messageBody":"Files created incorrectly are deleted\n","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":6},"test-code":{"insertions":0,"deletions":16}}},{"hash":"dc7ce86880838d67e6bada701d215b758055e384","isMergeCommit":false,"messageTitle":"Deleted another wrong file","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":0,"deletions":4}}},{"hash":"4339ddc4c04e48296e09599cb8662f962b15d070","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-F12-2/tp","messageBody":"","fileTypesAndContributionMap":{}}]}],"H4mes":[]},"authorFileTypeContributionMap":{"Ko-Khan":{"docs":26,"functional-code":0,"test-code":0},"Murugan-Maniish":{"docs":21,"functional-code":0,"test-code":0},"bennyLCK":{"docs":72,"functional-code":0,"test-code":0},"Howlong11":{"docs":8,"functional-code":0,"test-code":0},"H4mes":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Ko-Khan":69.84615,"Murugan-Maniish":246.05917,"bennyLCK":238.86388,"Howlong11":55640.332,"H4mes":0.0},"authorDisplayNameMap":{"Ko-Khan":"CS2103T-F12-2 AUNG..HANT","Murugan-Maniish":"CS2103T-F12-2 MURU..IISH","bennyLCK":"CS2103T-F12-2 BENN..IONG","Howlong11":"CS2103T-F12-2 HYUN..NKYU","H4mes":"CS2103T-F12-2 HAMI..DAWE"}} +{"authorDailyContributionsMap":{"Ko-Khan":[{"date":"2024-03-05","commitResults":[{"hash":"8c829e084381a2fb2ca9a73edf5e3883ddab2da2","isMergeCommit":false,"messageTitle":"Add use cases for adding and listing articles","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"bafd66ce8adfc838638d84502d914eeb56f74ec8","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F12-2:master\u0027 into branch-kk-usecases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3e33198887683e7a6c00188d6cb32645247659d6","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-kk-usecases\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5f4d84abb4aed7f555941c62238b4a46ed4d9123","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-kk-usecases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"aa240a93af3c493470ec40b5734c3a6f485f028a","isMergeCommit":false,"messageTitle":"Fix mistakes for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"29243328e9e1d85d519421d25949c85b6dfc6010","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-kk-usecases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3a53939fe781c1eb5d4e3aa6d104f2764bcd36f2","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/branch-kk-usecases\u0027 into branch-kk-usecases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ac94dcd8b1df8f66ef3cac6daed0a3eaa3f460cc","isMergeCommit":true,"messageTitle":"Merge pull request #16 from bennyLCK/branch-b-UseCases","messageBody":"Add use cases for edit, delete commands","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"d2b4021531370a6a42444ed5b82f985b2e4e9884","isMergeCommit":true,"messageTitle":"Merge pull request #20 from bennyLCK/branch-b-UseCases","messageBody":"Add NFR to developer guide","fileTypesAndContributionMap":{}},{"hash":"d4d8e53f3f2802e95d9feecb3bf33f7ca6190371","isMergeCommit":false,"messageTitle":"Update roles in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":4}}},{"hash":"c23088b2e210e7cfb5bb58d5bdfd903bc6509892","isMergeCommit":false,"messageTitle":"Fix to UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]}],"Murugan-Maniish":[{"date":"2024-02-26","commitResults":[{"hash":"9b5e0111a97855fdc2ec3a5fef9dfc95b6da4a9f","isMergeCommit":true,"messageTitle":"Merge branch \u0027switch-docs-to-markbind\u0027 of https://github.com/AY2324S2-CS2103T-F12-2/tp","messageBody":"* \u0027switch-docs-to-markbind\u0027 of https://github.com/AY2324S2-CS2103T-F12-2/tp:\n Reduce font size for printing\n Add a Home button in the top NavBar\n Bump MarkBind version\n Migrate docs to MarkBind\n","fileTypesAndContributionMap":{}},{"hash":"08ed9894d47168a27561b5cccfab8d9d14486122","isMergeCommit":false,"messageTitle":"Update the site configs to match fork","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"521fac173a700e38d69e60bd50e97ce279c7f0f2","isMergeCommit":false,"messageTitle":"Update the AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":22}}},{"hash":"95c9050d3e4777a98e4f3c1498f231e3413e1213","isMergeCommit":false,"messageTitle":"Update the README page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":11}}},{"hash":"195de7c7980a569ea7ed61a2c5bac4564b8d1acd","isMergeCommit":false,"messageTitle":"Fix AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"2d6bfaa55b94b901849042956b36070dd12738ed","isMergeCommit":false,"messageTitle":"Add end line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"c77c1e80de7e80630cdf9acf3303557fa98ee092","isMergeCommit":true,"messageTitle":"Merge pull request #15 from Howlong11/master","messageBody":"Edit Developer Guide","fileTypesAndContributionMap":{}}]}],"bennyLCK":[{"date":"2024-03-06","commitResults":[{"hash":"f9f2b0c8460b78ae6b35b5b6e74ab0d7c914aa4c","isMergeCommit":false,"messageTitle":"Add use cases for edit, delete commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":0}}},{"hash":"a8dd1ef57c9d81022e64fa08b8c5f5b87b0ce10d","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Murugan-Maniish/update_project_website","messageBody":"Update project website","fileTypesAndContributionMap":{}},{"hash":"868775f6951b63f0633a75d975a0a0f347e74f45","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-b-UseCases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ef038501c3d4cb3f6f69840e0aeebce0406f1811","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-b-UseCases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a9e06897d245d27b1701e568ec0821d01315adb1","isMergeCommit":true,"messageTitle":"Merge pull request #9 from Ko-Khan/branch-kk-usecases","messageBody":"Add use cases for adding and listing articles","fileTypesAndContributionMap":{}},{"hash":"43892d6f74a163d0a3ef57daa74eaee8547899b9","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-b-UseCases","messageBody":"# Conflicts:\n#\tdocs/DeveloperGuide.md\n","fileTypesAndContributionMap":{}},{"hash":"ab3507cc5152668716d80969086b39d113d502c2","isMergeCommit":false,"messageTitle":"Rectify DG use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"9d1dd162f801cd699eb60549f6ad83d5375265d2","isMergeCommit":false,"messageTitle":"Add use case for find article command","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":66,"deletions":27}}},{"hash":"a0a2a89e4c7f087834d1458fd6287613c3c0e1ee","isMergeCommit":false,"messageTitle":"Fix bugs regarding use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":30}}},{"hash":"c084bef71037014cc95c24a24164569cca247dd6","isMergeCommit":false,"messageTitle":"Add NFR to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":8}}},{"hash":"17fd76be53655e2ea654663fd97de93cfedf9aca","isMergeCommit":true,"messageTitle":"Merge pull request #21 from Ko-Khan/branch-kk-updateroles","messageBody":"Update roles in AboutUs","tags":["v1.1"],"fileTypesAndContributionMap":{}}]}],"Howlong11":[{"date":"2024-03-05","commitResults":[{"hash":"08a35423b25d20ce39bef1da629310883cde3454","isMergeCommit":false,"messageTitle":"Add Remark command","messageBody":"Remark attribute classes: adds remark to a Person object\n","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":0},"test-code":{"insertions":20,"deletions":0}}},{"hash":"9c07543433eb0761bf98896e727f3453161aecaf","isMergeCommit":false,"messageTitle":"Add Remark command","messageBody":"Remark classes: adds remark to Person objects\n","fileTypesAndContributionMap":{"functional-code":{"insertions":204,"deletions":13},"test-code":{"insertions":190,"deletions":17}}},{"hash":"ca6b0f1fea279cf2320412f2ff7c4affbb4b0eb1","isMergeCommit":false,"messageTitle":"Revert \"Add Remark command\"","messageBody":"This reverts commit 9c07543433eb0761bf98896e727f3453161aecaf.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":13,"deletions":204},"test-code":{"insertions":17,"deletions":190}}},{"hash":"98c11b8075229ac704cb4a1bce55d7f1049ab23d","isMergeCommit":false,"messageTitle":"Edit DG","messageBody":"Edit the original developer guide\u0027s Target user profile, Value proposition, NFR and Glossary\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":5}}}]},{"date":"2024-03-06","commitResults":[{"hash":"754159ea78479c251d01d77f5935c94e31fee177","isMergeCommit":false,"messageTitle":"Delete wrong files","messageBody":"Files created incorrectly are deleted\n","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":6},"test-code":{"insertions":0,"deletions":16}}},{"hash":"dc7ce86880838d67e6bada701d215b758055e384","isMergeCommit":false,"messageTitle":"Deleted another wrong file","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":0,"deletions":4}}},{"hash":"4339ddc4c04e48296e09599cb8662f962b15d070","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-F12-2/tp","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"28865c507e9b75d9e46102522485db4323b5c8cb","isMergeCommit":true,"messageTitle":"Merge pull request #18 from bennyLCK/branch-b-UseCases","messageBody":"Add use case for find article command","fileTypesAndContributionMap":{}}]}],"H4mes":[]},"authorFileTypeContributionMap":{"Ko-Khan":{"docs":26,"functional-code":0,"test-code":0},"Murugan-Maniish":{"docs":20,"functional-code":0,"test-code":0},"bennyLCK":{"docs":121,"functional-code":0,"test-code":0},"Howlong11":{"docs":8,"functional-code":0,"test-code":0},"H4mes":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Ko-Khan":74.40816,"Murugan-Maniish":229.94386,"bennyLCK":1931.2091,"Howlong11":51993.164,"H4mes":0.0},"authorDisplayNameMap":{"Ko-Khan":"CS2103T-F12-2 AUNG..HANT","Murugan-Maniish":"CS2103T-F12-2 MURU..IISH","bennyLCK":"CS2103T-F12-2 BENN..IONG","Howlong11":"CS2103T-F12-2 HYUN..NKYU","H4mes":"CS2103T-F12-2 HAMI..DAWE"}} diff --git a/AY2324S2-CS2103T-F12-4_tp_master/authorship.json b/AY2324S2-CS2103T-F12-4_tp_master/authorship.json index 9203f32a..3205d504 100644 --- a/AY2324S2-CS2103T-F12-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F12-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dhlee03"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F12-4/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F12-4/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dhlee03"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F12-4/tp/graph/badge.svg?token\u003dGBDKPFRKM5)](https://codecov.io/gh/AY2324S2-CS2103T-F12-4/tp)","lastModifiedDate":"2024-03-07"},{"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":"dhlee03"},"content":"* This is **a CS2103T team project for NUS Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"dhlee03"},"content":"* The project simulates an ongoing software project for a desktop application (called _HackLink_) used for managing contact details of Hackathon participants and sponsors.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"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":12,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"dhlee03"},"content":" * It is CLI based, so this is highly practical and efficient to use for hackathon organisers. ","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dhlee03"},"content":"* It is named `HackLink` because this app acts as a useful link between hackathon organiser and other participants.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dhlee03"},"content":"* For the detailed documentation of this project, see the **[HackLink Website](https://github.com/AY2324S2-CS2103T-F12-4/tp)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dhlee03"},"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":{"dhlee03":8,"-":8}},{"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":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | Add new participants to the contact managing app | Have a centralized database of all hackathon attendees. |","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | Update and edit participant contact details | Ensure accurate and up-to-date information. |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | Add notes or comments to contact | Provide additional context or reminders for each contact. |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | View contact count in the database | Know the number of participants, staff, etc. in the event |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | List out members | See all the members in one go |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | Remove specific participants | remove participants who signed up but unable to participate. |","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":"meenulekha"},"content":"**Use case: Add a Contact**","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":"meenulekha"},"content":"1. User requests to add a new contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"meenulekha"},"content":"2. System prompts for contact details: name, email, phone, category.","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"meenulekha"},"content":"3. User provides valid information.","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"meenulekha"},"content":"4. System validates input and adds the contact to the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"meenulekha"},"content":"5. System displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"meenulekha"},"content":"3a. Invalid input provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"meenulekha"},"content":" - System displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"meenulekha"},"content":" - Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"meenulekha"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"meenulekha"},"content":"**Use case: View Participant List**","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"meenulekha"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"meenulekha"},"content":"1. User requests to view the list of all participants.","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"meenulekha"},"content":"2. System displays the list with relevant information.","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"meenulekha"},"content":"3. System shows the total count of participants.","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"meenulekha"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"meenulekha"},"content":"**Use case:Update Participant Contact Details**","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"meenulekha"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"meenulekha"},"content":"1. User requests to update contact details for a specific participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"meenulekha"},"content":"2. System prompts for the participant\u0027s name and the field to update.","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"meenulekha"},"content":"3. User provides valid information.","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"meenulekha"},"content":"4. System validates input and updates the contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"meenulekha"},"content":"5. System displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"meenulekha"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"meenulekha"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"meenulekha"},"content":"3a. Invalid input provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"meenulekha"},"content":" - System displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"meenulekha"},"content":" - Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"meenulekha"},"content":"**Use case: Comment**","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"meenulekha"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"meenulekha"},"content":"1. User requests to add notes or comments to a participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"meenulekha"},"content":"2. System prompts for the participant\u0027s name and the notes.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"meenulekha"},"content":"3. User provides notes.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"meenulekha"},"content":"4. System adds the notes to the participant\u0027s profile.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"meenulekha"},"content":"5. System displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"meenulekha"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"meenulekha"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"meenulekha"},"content":"3a. No notes provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"meenulekha"},"content":" - System displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"meenulekha"},"content":" - Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"meenulekha"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"meenulekha"},"content":"**Use case: Remove Participant**","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"meenulekha"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"meenulekha"},"content":"1. User requests to remove a specific participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"meenulekha"},"content":"2. System prompts for the participant\u0027s ID.","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"meenulekha"},"content":"3. User provides the ID.","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"meenulekha"},"content":"4. System deletes the participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"meenulekha"},"content":"5. System displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"meenulekha"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"meenulekha"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"meenulekha"},"content":"3a. Participant not found.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"meenulekha"},"content":" - System displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"meenulekha"},"content":" - Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"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":380,"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":381,"author":{"gitId":"meenulekha"},"content":"4. The application should be designed to scale gracefully, accommodating an increase in the number of participants or contacts without significant degradation in performance.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"meenulekha"},"content":"5. The codebase should follow best practices and be well-documented to facilitate future maintenance and updates by developers.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"meenulekha"},"content":"6. The system should provide clear and user-friendly error messages for invalid inputs or failed operations, aiding users in understanding and resolving issues.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":389,"author":{"gitId":"meenulekha"},"content":"* **Java 11: A version of the Java programming language and runtime environment, required for running the application","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"meenulekha"},"content":"* **Participant: An individual registered to participate in the hackathon","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"meenulekha"},"content":"* **ID: A unique identifier assigned to each participant in the system","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"meenulekha"},"content":"* ","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"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":401,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"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":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"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":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"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":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"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":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"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":435,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"meenulekha":80,"-":365}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dhlee03"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F12-4/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F12-4/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dhlee03"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F12-4/tp/graph/badge.svg?token\u003dGBDKPFRKM5)](https://codecov.io/gh/AY2324S2-CS2103T-F12-4/tp)","lastModifiedDate":"2024-03-07"},{"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":"dhlee03"},"content":"* This is **a CS2103T team project for NUS Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"dhlee03"},"content":"* The project simulates an ongoing software project for a desktop application (called _HackLink_) used for managing contact details of Hackathon participants and sponsors.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"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":12,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"dhlee03"},"content":" * It is CLI based, so this is highly practical and efficient to use for hackathon organisers. ","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dhlee03"},"content":"* It is named `HackLink` because this app acts as a useful link between hackathon organiser and other participants.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dhlee03"},"content":"* For the detailed documentation of this project, see the **[HackLink Website](https://github.com/AY2324S2-CS2103T-F12-4/tp)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dhlee03"},"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":{"dhlee03":8,"-":8}},{"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":"julia-cp"},"content":"# About Us","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"julia-cp"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"julia-cp"},"content":"**HackLink** - a java application that help Student Hackathon organizers seamlessly handle participant, ","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"julia-cp"},"content":"staff, and sponsor details, ensuring every event runs smoothly.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"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":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"julia-cp"},"content":"Tutor: Tan Wei Zhe","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"julia-cp"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"julia-cp"},"content":"### Bach Le Tuan Khai","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"julia-cp"},"content":"\u003cimg src\u003d\"images/bachletuankhai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"julia-cp"},"content":"[[github](https://github.com/bachletuankhai)]","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"julia-cp"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"julia-cp"},"content":"* Responsibilities: Model","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"julia-cp"},"content":"### Julia Christy Purba","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"julia-cp"},"content":"\u003cimg src\u003d\"images/julia-cp.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"julia-cp"},"content":"[[github](https://github.com/julia-cp)]","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"julia-cp"},"content":"### Lee Donghyun","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"julia-cp"},"content":"\u003cimg src\u003d\"images/dhlee03.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"julia-cp"},"content":"[[github](https://github.com/dhlee03)]","lastModifiedDate":"2024-03-07"},{"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":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"julia-cp"},"content":"### Premakumar Meenu Lekha","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"julia-cp"},"content":"\u003cimg src\u003d\"images/meenulekha.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"julia-cp"},"content":"[[github](https://github.com/meenulekha)]","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"julia-cp"},"content":"* Responsibilities: Storage","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"julia-cp":21,"-":30}},{"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":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | Add new participants to the contact managing app | Have a centralized database of all hackathon attendees. |","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | Update and edit participant contact details | Ensure accurate and up-to-date information. |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | Add notes or comments to contact | Provide additional context or reminders for each contact. |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | View contact count in the database | Know the number of participants, staff, etc. in the event |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | List out members | See all the members in one go |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"meenulekha"},"content":"| `* * *` | Student Hackathon Organizer | Remove specific participants | remove participants who signed up but unable to participate. |","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":"meenulekha"},"content":"**Use case: Add a Contact**","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":"meenulekha"},"content":"1. User requests to add a new contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"meenulekha"},"content":"2. System prompts for contact details: name, email, phone, category.","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"meenulekha"},"content":"3. User provides valid information.","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"meenulekha"},"content":"4. System validates input and adds the contact to the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"meenulekha"},"content":"5. System displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"meenulekha"},"content":"3a. Invalid input provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"meenulekha"},"content":" - System displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"meenulekha"},"content":" - Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"meenulekha"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"meenulekha"},"content":"**Use case: View Participant List**","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"meenulekha"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"meenulekha"},"content":"1. User requests to view the list of all participants.","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"meenulekha"},"content":"2. System displays the list with relevant information.","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"meenulekha"},"content":"3. System shows the total count of participants.","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"meenulekha"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"meenulekha"},"content":"**Use case:Update Participant Contact Details**","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"meenulekha"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"meenulekha"},"content":"1. User requests to update contact details for a specific participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"meenulekha"},"content":"2. System prompts for the participant\u0027s name and the field to update.","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"meenulekha"},"content":"3. User provides valid information.","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"meenulekha"},"content":"4. System validates input and updates the contact details.","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"meenulekha"},"content":"5. System displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"meenulekha"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"meenulekha"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"meenulekha"},"content":"3a. Invalid input provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"meenulekha"},"content":" - System displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"meenulekha"},"content":" - Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"meenulekha"},"content":"**Use case: Comment**","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"meenulekha"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"meenulekha"},"content":"1. User requests to add notes or comments to a participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"meenulekha"},"content":"2. System prompts for the participant\u0027s name and the notes.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"meenulekha"},"content":"3. User provides notes.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"meenulekha"},"content":"4. System adds the notes to the participant\u0027s profile.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"meenulekha"},"content":"5. System displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"meenulekha"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"meenulekha"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"meenulekha"},"content":"3a. No notes provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"meenulekha"},"content":" - System displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"meenulekha"},"content":" - Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"meenulekha"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"meenulekha"},"content":"**Use case: Remove Participant**","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"meenulekha"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"meenulekha"},"content":"1. User requests to remove a specific participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"meenulekha"},"content":"2. System prompts for the participant\u0027s ID.","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"meenulekha"},"content":"3. User provides the ID.","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"meenulekha"},"content":"4. System deletes the participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"meenulekha"},"content":"5. System displays a success message.","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"meenulekha"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"meenulekha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"meenulekha"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"meenulekha"},"content":"3a. Participant not found.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"meenulekha"},"content":" - System displays an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"meenulekha"},"content":" - Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"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":380,"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":381,"author":{"gitId":"meenulekha"},"content":"4. The application should be designed to scale gracefully, accommodating an increase in the number of participants or contacts without significant degradation in performance.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"meenulekha"},"content":"5. The codebase should follow best practices and be well-documented to facilitate future maintenance and updates by developers.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"meenulekha"},"content":"6. The system should provide clear and user-friendly error messages for invalid inputs or failed operations, aiding users in understanding and resolving issues.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":389,"author":{"gitId":"meenulekha"},"content":"* **Java 11: A version of the Java programming language and runtime environment, required for running the application","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"meenulekha"},"content":"* **Participant: An individual registered to participate in the hackathon","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"meenulekha"},"content":"* **ID: A unique identifier assigned to each participant in the system","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"meenulekha"},"content":"* ","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"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":401,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"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":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"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":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"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":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"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":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"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":435,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"meenulekha":80,"-":365}}] diff --git a/AY2324S2-CS2103T-F12-4_tp_master/commits.json b/AY2324S2-CS2103T-F12-4_tp_master/commits.json index ad5e212b..8ddd32bf 100644 --- a/AY2324S2-CS2103T-F12-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-F12-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"dhlee03":[{"date":"2024-03-07","commitResults":[{"hash":"bac41f0637d3f00453800f2901765680ea7b32c4","isMergeCommit":false,"messageTitle":"Update README.md content","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"b9c41c3b5b565be4898fbb754073ab1ab94767b0","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"adb8b2e5d2d4908533ebda34e94cd512119b58be","isMergeCommit":false,"messageTitle":"Update Ui.png and codecov","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"16b3716551d5de0b7ca4b22f11383fcc3f939ce5","isMergeCommit":false,"messageTitle":"Add newline","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"julia-cp":[],"meenulekha":[{"date":"2024-03-07","commitResults":[{"hash":"eddda080c683902fb9b4dcbb7a1c6e31b4b30322","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":22}}}]}],"bachletuankhai":[{"date":"2024-03-07","commitResults":[{"hash":"477ba4b55a24e6bf6c286960c8a696bc5b66f627","isMergeCommit":true,"messageTitle":"Merge pull request #1 from dhlee03/branch-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"3af92b62d197a67555fcdd17ac3148b2ad08f6ef","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-F12-4/meenulekha-patch-1","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"dhlee03":{"docs":8,"functional-code":0,"test-code":0},"julia-cp":{"docs":0,"functional-code":0,"test-code":0},"meenulekha":{"docs":80,"functional-code":0,"test-code":0},"bachletuankhai":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"dhlee03":16.979591,"julia-cp":0.0,"meenulekha":759.37244,"bachletuankhai":0.0},"authorDisplayNameMap":{"dhlee03":"CS2103T-F12-4 LEE ..HYUN","julia-cp":"CS2103T-F12-4 JULI..URBA","meenulekha":"CS2103T-F12-4 PREM..EKHA","bachletuankhai":"CS2103T-F12-4 BACH..KHAI"}} +{"authorDailyContributionsMap":{"dhlee03":[{"date":"2024-03-07","commitResults":[{"hash":"bac41f0637d3f00453800f2901765680ea7b32c4","isMergeCommit":false,"messageTitle":"Update README.md content","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"b9c41c3b5b565be4898fbb754073ab1ab94767b0","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"adb8b2e5d2d4908533ebda34e94cd512119b58be","isMergeCommit":false,"messageTitle":"Update Ui.png and codecov","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"16b3716551d5de0b7ca4b22f11383fcc3f939ce5","isMergeCommit":false,"messageTitle":"Add newline","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"9d9064cd9fcb415cc6a38293dd27cc731df187c8","isMergeCommit":true,"messageTitle":"Merge pull request #8 from julia-cp/branch-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}}]}],"julia-cp":[{"date":"2024-03-07","commitResults":[{"hash":"db789d9d936355fe0c7682f6cb41a81c1f6378db","isMergeCommit":false,"messageTitle":"Update AboutUs.md to reflect this team.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":23}}},{"hash":"a6cc6b15d51dc04f9fef3bd513ff51e5960c52f0","isMergeCommit":false,"messageTitle":"Add team members\u0027 photos.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"31d34efe3eefa76b6432191519d73ea79a205c4c","isMergeCommit":false,"messageTitle":"Remove links to portfolio.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":4}}},{"hash":"4ff5b7413e73d4c14429fe5f812a9cac8fc96f36","isMergeCommit":false,"messageTitle":"Rename photo files to match each GitHub username.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]}],"meenulekha":[{"date":"2024-03-07","commitResults":[{"hash":"eddda080c683902fb9b4dcbb7a1c6e31b4b30322","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":22}}}]}],"bachletuankhai":[{"date":"2024-03-07","commitResults":[{"hash":"477ba4b55a24e6bf6c286960c8a696bc5b66f627","isMergeCommit":true,"messageTitle":"Merge pull request #1 from dhlee03/branch-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"3af92b62d197a67555fcdd17ac3148b2ad08f6ef","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-F12-4/meenulekha-patch-1","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"dhlee03":{"docs":8,"functional-code":0,"test-code":0},"julia-cp":{"docs":21,"functional-code":0,"test-code":0},"meenulekha":{"docs":80,"functional-code":0,"test-code":0},"bachletuankhai":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"dhlee03":16.979591,"julia-cp":254.9592,"meenulekha":759.37244,"bachletuankhai":0.0},"authorDisplayNameMap":{"dhlee03":"CS2103T-F12-4 LEE ..HYUN","julia-cp":"CS2103T-F12-4 JULI..URBA","meenulekha":"CS2103T-F12-4 PREM..EKHA","bachletuankhai":"CS2103T-F12-4 BACH..KHAI"}} diff --git a/AY2324S2-CS2103T-F13-1_tp_master/authorship.json b/AY2324S2-CS2103T-F13-1_tp_master/authorship.json index fc72d8b5..5f20dbee 100644 --- a/AY2324S2-CS2103T-F13-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F13-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F13-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F13-1/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F13-1/tp/graph/badge.svg?token\u003d58YEQ4Q1CC)](https://codecov.io/gh/AY2324S2-CS2103T-F13-1/tp)","lastModifiedDate":"2024-02-16"},{"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":"belligerentbeagle"},"content":"* TAPro is **a Contact Book application** that is made for Computer Science Tutors for managing their students contact and performance details.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"content":" * Add a student\u0027s contact details.","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":" * Record attendance of the student.","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"* For the detailed documentation of the original project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"belligerentbeagle":7,"-":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":"-"},"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":"belligerentbeagle"},"content":"### Ethan Wei Yuxin","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/belligerentbeagle.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"[[homepage](http://www.ethanwei.me)]","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"[[github](https://github.com/belligerentbeagle)]","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"[[portfolio](team/ethanwei.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"saiutkarsh33"},"content":"### Sai Utkarsh","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"saiutkarsh33"},"content":"\u003cimg src\u003d\"images/saiutkarsh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"saiutkarsh33"},"content":"[[github](https://github.com/saiutkarsh33)]","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"saiutkarsh33"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"saiutkarsh33"},"content":"* Responsibilities: SWE","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"saiutkarsh33"},"content":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/saiutkarsh33.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"belligerentbeagle"},"content":"[[github](https://github.com/saiutkarsh33)]","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"tituschewxj"},"content":"[[portfolio](team/sai.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"belligerentbeagle"},"content":"### Titus Chew ","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/tituschewxj.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"belligerentbeagle"},"content":"[[github](http://github.com/tituschewxj)] ","lastModifiedDate":"2024-02-29"},{"lineNumber":48,"author":{"gitId":"belligerentbeagle"},"content":"[[portfolio](team/titus.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":51,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"tituschewxj"},"content":"### Wu Xiaoyun","lastModifiedDate":"2024-02-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/foraeons.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"belligerentbeagle"},"content":"[[github](http://github.com/ForAeons)]","lastModifiedDate":"2024-02-29"},{"lineNumber":59,"author":{"gitId":"belligerentbeagle"},"content":"[[portfolio](team/xiaoyun.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":62,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"belligerentbeagle"},"content":"### Anant Shanker","lastModifiedDate":"2024-02-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/anant1902.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"belligerentbeagle"},"content":"[[github](http://github.com/anant1902)]","lastModifiedDate":"2024-02-29"},{"lineNumber":70,"author":{"gitId":"belligerentbeagle"},"content":"[[portfolio](team/anant.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":73,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"tituschewxj":7,"saiutkarsh33":6,"belligerentbeagle":23,"-":38}},{"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":"saiutkarsh33"},"content":"* Teaching Assistant for a Computer Science module in NUS ","lastModifiedDate":"2024-02-29"},{"lineNumber":277,"author":{"gitId":"saiutkarsh33"},"content":"* tech savvy ","lastModifiedDate":"2024-02-28"},{"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":"saiutkarsh33"},"content":"**Value proposition**: All in one Address book managing student’s progress in the course, by means of participation, grades, and other course specific attributes of an NUS CS class. Can quickly find information, filter and sort with keyboard shortcuts.","lastModifiedDate":"2024-02-28"},{"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":"saiutkarsh33"},"content":"|----------|---------|--------------|-----------------|","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | name/rename the CS course that I am tutoring this semester | keep track of the module I am teaching |","lastModifiedDate":"2024-02-28"},{"lineNumber":293,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | add a student to the CS course that I am tutoring that semester to my class | keep track of him or her |","lastModifiedDate":"2024-02-28"},{"lineNumber":294,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | view all students from my class | view details about all of them |","lastModifiedDate":"2024-02-28"},{"lineNumber":295,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | mark attendance for a student in my class | keep track of who\u0027s present |","lastModifiedDate":"2024-02-28"},{"lineNumber":296,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | unmark attendance for a student in my class | keep track of who is absent |","lastModifiedDate":"2024-02-28"},{"lineNumber":297,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | delete a student | remove a student if he or she leaves the class |","lastModifiedDate":"2024-02-28"},{"lineNumber":298,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | know all the commands of the address book | use it effectively |","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"saiutkarsh33"},"content":"(For all use cases below, the **System** is the `TA Pro` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-02-29"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":308,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":310,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":311,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to delete a specific student based on NUSNet ID.","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to add a student, providing the name and NUSNet ID as compulsory information, with the phone number being optional.","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Name/Rename CS Course**","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to name or rename a CS course by specifying the course name and the new name if applicable.","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":331,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: View All Students**","lastModifiedDate":"2024-02-28"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to view a list of all students.","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Mark Attendance**","lastModifiedDate":"2024-02-28"},{"lineNumber":340,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":341,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":342,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":343,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to mark attendance for a student by providing the student\u0027s NUSNet ID; specifying the week is optional.","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":345,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":346,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":347,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Un-mark Attendance**","lastModifiedDate":"2024-02-29"},{"lineNumber":348,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":349,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":350,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":351,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to un-mark attendance for a student by providing the student\u0027s NUSNet ID; specifying the week is optional.","lastModifiedDate":"2024-02-29"},{"lineNumber":352,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":353,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":354,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":355,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Know Commands for the Address Book**","lastModifiedDate":"2024-02-28"},{"lineNumber":356,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":357,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to view the list of available commands for the AddressBook.","lastModifiedDate":"2024-02-28"},{"lineNumber":360,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":361,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":364,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"saiutkarsh33"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` installed.","lastModifiedDate":"2024-02-28"},{"lineNumber":381,"author":{"gitId":"saiutkarsh33"},"content":"2. System to load the main interface in under 1 second on standard educational institution hardware.","lastModifiedDate":"2024-02-28"},{"lineNumber":382,"author":{"gitId":"saiutkarsh33"},"content":"3. Application to be accessible on devices commonly used by the educational institution, such as desktop computers, laptops, and tablet.","lastModifiedDate":"2024-02-28"},{"lineNumber":383,"author":{"gitId":"saiutkarsh33"},"content":"4. System to ensure data integrity, with a goal of zero data loss over the academic year.","lastModifiedDate":"2024-02-28"},{"lineNumber":384,"author":{"gitId":"saiutkarsh33"},"content":"5. Input validation to prevent errors due to incorrect data entry.","lastModifiedDate":"2024-02-28"},{"lineNumber":385,"author":{"gitId":"saiutkarsh33"},"content":"6. Application to handle common errors gracefully, such as incorrect data entry, without crashing or losing data.","lastModifiedDate":"2024-02-28"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":392,"author":{"gitId":"saiutkarsh33"},"content":"* **CS**: Computer Science","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"saiutkarsh33"},"content":"* **NUS**: National University of Singapore","lastModifiedDate":"2024-02-29"},{"lineNumber":394,"author":{"gitId":"saiutkarsh33"},"content":"* **TA**: Teaching Assistant","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":404,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":405,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"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":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"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":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"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":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"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":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"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":439,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"saiutkarsh33":70,"-":379}},{"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":"belligerentbeagle"},"content":"# TAPro User Guide","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"TAPro is a **a Contact Book application** that is made for Computer Science Tutors for managing their students contact and performance details.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"TAPro is optimized for use via a **Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). ","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"If you can type fast, TAPro can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","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":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"1. Download the latest `tapro.jar` from [here](https://github.com/AY2324S2-CS2103T-F13-1/tp/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your TAPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"belligerentbeagle"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar tapro.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"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":30,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"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":33,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"belligerentbeagle"},"content":" * `addstu nn/e0952224 n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Contact Book.","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"belligerentbeagle"},"content":" * `delstu 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","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":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"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":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"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":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"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":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"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":68,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":70,"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":71,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"saiutkarsh33"},"content":"### Name/Rename CS course : `setcrs`","lastModifiedDate":"2024-02-28"},{"lineNumber":83,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":84,"author":{"gitId":"saiutkarsh33"},"content":"Names the course in question. ","lastModifiedDate":"2024-02-28"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":86,"author":{"gitId":"saiutkarsh33"},"content":"Format: `setcrs COURSE_NAME`","lastModifiedDate":"2024-02-28"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"saiutkarsh33"},"content":"Duplicate course are not allowed.","lastModifiedDate":"2024-02-28"},{"lineNumber":89,"author":{"gitId":"saiutkarsh33"},"content":"Courses are case-insensitive.","lastModifiedDate":"2024-02-28"},{"lineNumber":90,"author":{"gitId":"saiutkarsh33"},"content":"Course code should follow the format \"XX1234Y\", Y is optional.","lastModifiedDate":"2024-02-28"},{"lineNumber":91,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"saiutkarsh33"},"content":"### Adding a student: `addstu`","lastModifiedDate":"2024-03-07"},{"lineNumber":93,"author":{"gitId":"ForAeons"},"content":"Adds a student to the address book.","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"ForAeons"},"content":"Format: `addstu n/NAME p/PHONE_NUMBER e/EMAIL nn/NUSNET_ID a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","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":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":"* `addstu n/John Doe p/98765432 e/johnd@example.com nn/e1234567 a/John street, block 123, #01-01`","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":"* `add n/Betsy nn/e01234567 Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"Anant1902"},"content":"### Listing all students : `list`","lastModifiedDate":"2024-03-07"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"saiutkarsh33"},"content":"If there are additional arguments behind `list` we will simply ignore them.","lastModifiedDate":"2024-02-28"},{"lineNumber":113,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":114,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"ForAeons"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [nn/NUSNET_ID] [t/TAG]…​`","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"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":121,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"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":124,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" specifying any tags after it.","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":"* `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":129,"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":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"Anant1902"},"content":"### Locating students by name: `find`","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"Anant1902"},"content":"### Marking a student\u0027s attendance for a given week by their NUSNet: `mark`","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"Anant1902"},"content":"Marks a student\u0027s attendance for a particular week.","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"Anant1902"},"content":"Format: `mark nn/NUSNET_ID wk/WEEK_NUMBER`","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"Anant1902"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"Anant1902"},"content":"* `mark nn/e1234567 wk/3`","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"Anant1902"},"content":"### Deleting a student : `delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"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":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"belligerentbeagle"},"content":"TAPro\u0027s 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-06"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":191,"author":{"gitId":"belligerentbeagle"},"content":"TAPro\u0027s 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-06"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":193,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"belligerentbeagle"},"content":"If your changes to the data file makes its format invalid, TAPro 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-06"},{"lineNumber":197,"author":{"gitId":"belligerentbeagle"},"content":"Furthermore, certain edits can cause the TAPro 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":"2024-03-06"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"belligerentbeagle"},"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 TAPro home folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":215,"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":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":217,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":219,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"ForAeons"},"content":"**Add Student** | `addstu n/NAME p/PHONE_NUMBER e/EMAIL nn/NUSNET_ID a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com nn/e1234567 a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2024-02-25"},{"lineNumber":224,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"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":227,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"saiutkarsh33":11,"belligerentbeagle":16,"-":183,"ForAeons":6,"Anant1902":13}},{"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":"belligerentbeagle"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eTAPro\u003c/a\u003e","lastModifiedDate":"2024-02-29"},{"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":{"belligerentbeagle":1,"-":66}},{"path":"docs/team/anant.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":"layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"belligerentbeagle"},"content":"title: \"Anant\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-29"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"belligerentbeagle":26}},{"path":"docs/team/ethanwei.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"belligerentbeagle"},"content":" title: \"Ethan Wei\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-28"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**: ","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"belligerentbeagle":26}},{"path":"docs/team/sai.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":"layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"belligerentbeagle"},"content":"title: \"Sai\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-29"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"belligerentbeagle":26}},{"path":"docs/team/titus.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":"layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"belligerentbeagle"},"content":"title: \"Titus\u0027 Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-29"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"belligerentbeagle":26}},{"path":"docs/team/xiaoyun.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":"layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"belligerentbeagle"},"content":"title: \"Xiao Yun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-29"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"belligerentbeagle":26}},{"path":"src/main/java/seedu/address/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2023-07-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"ForAeons"},"content":"import java.util.ArrayList;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.Prefix;","lastModifiedDate":"2023-07-14"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" ArrayList\u003cString\u003e duplicateFieldsArray \u003d new ArrayList\u003c\u003e(duplicateFields);","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":" duplicateFieldsArray.sort(String::compareToIgnoreCase);","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"ForAeons"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFieldsArray);","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" .append(\"; NUSNET: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" .append(person.getNusNet())","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" .append(\"; Tags: \");","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" person.getTags().forEach(builder::append);","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":50,"ForAeons":7}},{"path":"src/main/java/seedu/address/logic/commands/AddPersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"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.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-05-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-01-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"ForAeons"},"content":"public class AddPersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":" public static final String COMMAND_WORD \u003d \"addstu\";","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" + PREFIX_NUSNET + \"NUSNET \"","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" + PREFIX_NUSNET + \"e0123456 \"","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"friends \"","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"owesMoney\";","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" public AddPersonCommand(Person person) {","lastModifiedDate":"2024-02-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof AddPersonCommand)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":77,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand otherAddCommand \u003d (AddPersonCommand) other;","lastModifiedDate":"2024-02-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":79,"ForAeons":8}},{"path":"src/main/java/seedu/address/logic/commands/DeletePersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-09-01"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Deletes a person identified using it\u0027s displayed index from the address book.","lastModifiedDate":"2018-04-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"public class DeletePersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"delete\";","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \": Deletes the person identified by the index number used in the displayed person list.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer)\\n\"","lastModifiedDate":"2016-09-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1\";","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_PERSON_SUCCESS \u003d \"Deleted Person: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final Index targetIndex;","lastModifiedDate":"2017-06-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" public DeletePersonCommand(Index targetIndex) {","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.targetIndex \u003d targetIndex;","lastModifiedDate":"2016-09-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (targetIndex.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Person personToDelete \u003d lastShownList.get(targetIndex.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" model.deletePerson(personToDelete);","lastModifiedDate":"2016-09-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_DELETE_PERSON_SUCCESS, Messages.format(personToDelete)));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof DeletePersonCommand)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand otherDeleteCommand \u003d (DeletePersonCommand) other;","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return targetIndex.equals(otherDeleteCommand.targetIndex);","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" .add(\"targetIndex\", targetIndex)","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":65,"ForAeons":4}},{"path":"src/main/java/seedu/address/logic/commands/EditPersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-12-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-05-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.CollectionUtil;","lastModifiedDate":"2016-12-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2016-12-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2016-12-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2016-12-26"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2016-12-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":"public class EditPersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" + \"[\" + PREFIX_NUSNET + \"NUSNET] \"","lastModifiedDate":"2024-02-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" + PREFIX_NUSNET + \"e0123456 \"","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" public EditPersonCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2024-02-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":68,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":91,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":99,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" NusNet updatedNusNet \u003d editPersonDescriptor.getNusNet().orElse(personToEdit.getNusNet());","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":109,"author":{"gitId":"ForAeons"},"content":" return new Person(updatedName, updatedPhone, updatedEmail, updatedNusNet, updatedAddress, updatedTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":119,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof EditPersonCommand)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":123,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand otherEditCommand \u003d (EditPersonCommand) other;","lastModifiedDate":"2024-02-26"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":137,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":140,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":141,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":142,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":143,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":144,"author":{"gitId":"ForAeons"},"content":" private NusNet nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":145,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-06-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":148,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":150,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":151,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":152,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":153,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":154,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":155,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":156,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":158,"author":{"gitId":"ForAeons"},"content":" setNusNet(toCopy.nusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":159,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":160,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":163,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":164,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":165,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":167,"author":{"gitId":"ForAeons"},"content":" return CollectionUtil.isAnyNonNull(name, phone, email, nusNet, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":170,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":171,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":174,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":176,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":178,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":179,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":180,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":182,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":183,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":184,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":186,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":187,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":188,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":191,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":194,"author":{"gitId":"ForAeons"},"content":" public void setNusNet(NusNet nusNet) {","lastModifiedDate":"2024-02-25"},{"lineNumber":195,"author":{"gitId":"ForAeons"},"content":" this.nusNet \u003d nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":196,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"ForAeons"},"content":" public Optional\u003cNusNet\u003e getNusNet() {","lastModifiedDate":"2024-02-25"},{"lineNumber":199,"author":{"gitId":"ForAeons"},"content":" return Optional.ofNullable(nusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":200,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":201,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":203,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":206,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":207,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","lastModifiedDate":"2017-06-21"},{"lineNumber":208,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":210,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":211,"author":{"gitId":"-"},"content":" * Sets {@code tags} to this object\u0027s {@code tags}.","lastModifiedDate":"2018-01-11"},{"lineNumber":212,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":213,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":214,"author":{"gitId":"-"},"content":" public void setTags(Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-06-21"},{"lineNumber":215,"author":{"gitId":"-"},"content":" this.tags \u003d (tags !\u003d null) ? new HashSet\u003c\u003e(tags) : null;","lastModifiedDate":"2018-01-11"},{"lineNumber":216,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":218,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":219,"author":{"gitId":"-"},"content":" * Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2018-01-11"},{"lineNumber":220,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":221,"author":{"gitId":"-"},"content":" * Returns {@code Optional#empty()} if {@code tags} is null.","lastModifiedDate":"2018-01-11"},{"lineNumber":222,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":223,"author":{"gitId":"-"},"content":" public Optional\u003cSet\u003cTag\u003e\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":224,"author":{"gitId":"-"},"content":" return (tags !\u003d null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();","lastModifiedDate":"2018-01-11"},{"lineNumber":225,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":227,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":228,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":229,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":230,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":231,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":233,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":234,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":235,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":236,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":238,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":239,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":240,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":241,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":242,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":243,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":244,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":252,"author":{"gitId":"ForAeons"},"content":" .add(\"nusNet\", nusNet)","lastModifiedDate":"2024-02-25"},{"lineNumber":253,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":258,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"-":236,"ForAeons":22}},{"path":"src/main/java/seedu/address/logic/commands/FindPersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Finds and lists all persons in address book whose name contains any of the argument keywords.","lastModifiedDate":"2016-09-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Keyword matching is case insensitive.","lastModifiedDate":"2018-04-01"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":"public class FindPersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"find\";","lastModifiedDate":"2016-09-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Finds all persons whose names contain any of \"","lastModifiedDate":"2016-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"the specified keywords (case-insensitive) and displays them as a list with index numbers.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \"Parameters: KEYWORD [MORE_KEYWORDS]...\\n\"","lastModifiedDate":"2016-09-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" alice bob charlie\";","lastModifiedDate":"2016-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final NameContainsKeywordsPredicate predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" public FindPersonCommand(NameContainsKeywordsPredicate predicate) {","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.predicate \u003d predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(predicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return new CommandResult(","lastModifiedDate":"2018-04-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getFilteredPersonList().size()));","lastModifiedDate":"2018-04-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof FindPersonCommand)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand otherFindCommand \u003d (FindPersonCommand) other;","lastModifiedDate":"2024-02-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return predicate.equals(otherFindCommand.predicate);","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .add(\"predicate\", predicate)","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"-":54,"ForAeons":4}},{"path":"src/main/java/seedu/address/logic/commands/ListPersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Lists all persons in the address book to the user.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"public class ListPersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"list\";","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"Listed all persons\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_SUCCESS);","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":23,"ForAeons":1}},{"path":"src/main/java/seedu/address/logic/parser/AddPersonCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-02-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-02-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-02-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-03-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-03-17"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-03-17"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-03-17"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-03-17"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-17"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" * Parses input arguments and creates a new AddPersonCommand object","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"ForAeons"},"content":"public class AddPersonCommandParser implements Parser\u003cAddPersonCommand\u003e {","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" * Parses the given {@code String} of arguments in the context of the AddPersonCommand","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" * and returns an AddPersonCommand object for execution.","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":" public AddPersonCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" PREFIX_EMAIL, PREFIX_NUSNET)","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddPersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"ForAeons"},"content":" PREFIX_NUSNET, PREFIX_ADDRESS);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" NusNet nusNet \u003d ParserUtil.parseNusNet(argMultimap.getValue(PREFIX_NUSNET).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagList \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2017-03-17"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" Person person \u003d new Person(name, phone, email, nusNet, address, tagList);","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" return new AddPersonCommand(person);","lastModifiedDate":"2024-02-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":62,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":63,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":67,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"-":49,"ForAeons":18}},{"path":"src/main/java/seedu/address/logic/parser/AddressBookParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.LogsCenter;","lastModifiedDate":"2023-07-29"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ClearCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.Command;","lastModifiedDate":"2017-01-18"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.DeletePersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ExitCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.FindPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.HelpCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.ListPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses user input.","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddressBookParser {","lastModifiedDate":"2017-07-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Used for initial separation of command word and args.","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Pattern BASIC_COMMAND_FORMAT \u003d Pattern.compile(\"(?\u003ccommandWord\u003e\\\\S+)(?\u003carguments\u003e.*)\");","lastModifiedDate":"2016-09-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AddressBookParser.class);","lastModifiedDate":"2023-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Parses user input into command for execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @param userInput full user input string","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @return the command based on the user input","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" final Matcher matcher \u003d BASIC_COMMAND_FORMAT.matcher(userInput.trim());","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (!matcher.matches()) {","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Note to developers: Change the log level in config.json to enable lower level (i.e., FINE, FINER and lower)","lastModifiedDate":"2023-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // log messages such as the one below.","lastModifiedDate":"2023-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Lower level log messages are used sparingly to minimize noise in the code.","lastModifiedDate":"2023-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" logger.fine(\"Command word: \" + commandWord + \"; Arguments: \" + arguments);","lastModifiedDate":"2023-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" switch (commandWord) {","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" case AddPersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" return new AddPersonCommandParser().parse(arguments);","lastModifiedDate":"2024-02-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" case EditPersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":" return new EditPersonCommandParser().parse(arguments);","lastModifiedDate":"2024-02-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" case DeletePersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":63,"author":{"gitId":"ForAeons"},"content":" return new DeletePersonCommandParser().parse(arguments);","lastModifiedDate":"2024-02-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" case ClearCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new ClearCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" case FindPersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":69,"author":{"gitId":"ForAeons"},"content":" return new FindPersonCommandParser().parse(arguments);","lastModifiedDate":"2024-02-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" case ListPersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":72,"author":{"gitId":"ForAeons"},"content":" return new ListPersonCommand();","lastModifiedDate":"2024-02-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" case ExitCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new ExitCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" case HelpCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return new HelpCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" default:","lastModifiedDate":"2016-08-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" logger.finer(\"This user input caused a ParseException: \" + userInput);","lastModifiedDate":"2023-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":71,"ForAeons":15}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":" public static final Prefix PREFIX_NUSNET \u003d new Prefix(\"nn/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":15,"ForAeons":1}},{"path":"src/main/java/seedu/address/logic/parser/DeletePersonCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":6,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.DeletePersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":10,"author":{"gitId":"ForAeons"},"content":" * Parses input arguments and creates a new DeletePersonCommand object","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":"public class DeletePersonCommandParser implements Parser\u003cDeletePersonCommand\u003e {","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":15,"author":{"gitId":"ForAeons"},"content":" * Parses the given {@code String} of arguments in the context of the DeletePersonCommand","lastModifiedDate":"2024-02-26"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":" * and returns a DeletePersonCommand object for execution.","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":" public DeletePersonCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2017-05-25"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":" return new DeletePersonCommand(index);","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeletePersonCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":21,"ForAeons":8}},{"path":"src/main/java/seedu/address/logic/parser/EditPersonCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-01-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"ForAeons"},"content":" * Parses input arguments and creates a new EditPersonCommand object","lastModifiedDate":"2024-02-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":"public class EditPersonCommandParser implements Parser\u003cEditPersonCommand\u003e {","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":" * Parses the given {@code String} of arguments in the context of the EditPersonCommand","lastModifiedDate":"2024-02-26"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" * and returns an EditPersonCommand object for execution.","lastModifiedDate":"2024-02-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" public EditPersonCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_NAME).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"-"},"content":" editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":62,"author":{"gitId":"-"},"content":" parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2017-06-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":65,"author":{"gitId":"ForAeons"},"content":" throw new ParseException(EditPersonCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2024-02-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" return new EditPersonCommand(index, editPersonDescriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2017-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2017-01-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2017-03-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" private Optional\u003cSet\u003cTag\u003e\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2017-01-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2017-01-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":75,"ForAeons":11}},{"path":"src/main/java/seedu/address/logic/parser/FindPersonCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.FindPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":" * Parses input arguments and creates a new FindPersonCommand object","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":"public class FindPersonCommandParser implements Parser\u003cFindPersonCommand\u003e {","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":" * Parses the given {@code String} of arguments in the context of the FindPersonCommand","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":" * and returns a FindPersonCommand object for execution.","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":21,"author":{"gitId":"ForAeons"},"content":" public FindPersonCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" String trimmedArgs \u003d args.trim();","lastModifiedDate":"2017-02-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" if (trimmedArgs.isEmpty()) {","lastModifiedDate":"2017-02-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindPersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" String[] nameKeywords \u003d trimmedArgs.split(\"\\\\s+\");","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" return new FindPersonCommand(new NameContainsKeywordsPredicate(Arrays.asList(nameKeywords)));","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":25,"ForAeons":8}},{"path":"src/main/java/seedu/address/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-02-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-02-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":32,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":34,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":49,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":57,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":61,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":62,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":64,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":72,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":74,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":76,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":77,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":79,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":89,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":90,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":93,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"ForAeons"},"content":" * Parses a {@code String nusNet} into a {@code NusNet}.","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"ForAeons"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" * @throws ParseException if the given {@code nusNet} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" public static NusNet parseNusNet(String nusNet) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" requireNonNull(nusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" String trimmedNusNet \u003d nusNet.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":" if (!NusNet.isValidNusNet(trimmedNusNet)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"ForAeons"},"content":" throw new ParseException(NusNet.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"ForAeons"},"content":" return new NusNet(trimmedNusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":119,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":121,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":123,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":129,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":131,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":133,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":134,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":135,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":136,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":138,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":140,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":124,"ForAeons":16}},{"path":"src/main/java/seedu/address/model/person/NusNet.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"ForAeons"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"ForAeons"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-24"},{"lineNumber":4,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-24"},{"lineNumber":5,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":6,"author":{"gitId":"ForAeons"},"content":"/**","lastModifiedDate":"2024-02-24"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":" * Represents a Person\u0027s NUSNET in the address book.","lastModifiedDate":"2024-02-24"},{"lineNumber":8,"author":{"gitId":"ForAeons"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidNusNet(String)}","lastModifiedDate":"2024-02-24"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-24"},{"lineNumber":10,"author":{"gitId":"ForAeons"},"content":"public class NusNet {","lastModifiedDate":"2024-02-24"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"NUSNET should be of the format E\"","lastModifiedDate":"2024-02-24"},{"lineNumber":13,"author":{"gitId":"ForAeons"},"content":" + \"followed by 7 digits\";","lastModifiedDate":"2024-02-24"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":" public static final String VALIDATION_REGEX \u003d \"^[Ee]\\\\d{7}$\";","lastModifiedDate":"2024-02-24"},{"lineNumber":15,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":" public final String value;","lastModifiedDate":"2024-02-24"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-24"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":" * Constructs an {@code NusNet}.","lastModifiedDate":"2024-02-24"},{"lineNumber":20,"author":{"gitId":"ForAeons"},"content":" *","lastModifiedDate":"2024-02-24"},{"lineNumber":21,"author":{"gitId":"ForAeons"},"content":" * @param nusnet A valid nusnet id.","lastModifiedDate":"2024-02-24"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-24"},{"lineNumber":23,"author":{"gitId":"ForAeons"},"content":" public NusNet(String nusnet) {","lastModifiedDate":"2024-02-24"},{"lineNumber":24,"author":{"gitId":"ForAeons"},"content":" requireNonNull(nusnet);","lastModifiedDate":"2024-02-24"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" checkArgument(isValidNusNet(nusnet), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-24"},{"lineNumber":26,"author":{"gitId":"ForAeons"},"content":" value \u003d nusnet;","lastModifiedDate":"2024-02-24"},{"lineNumber":27,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-24"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" * Returns if a given string is a valid nusnet id.","lastModifiedDate":"2024-02-24"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-24"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" public static boolean isValidNusNet(String test) {","lastModifiedDate":"2024-02-24"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-02-24"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":35,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" @Override","lastModifiedDate":"2024-02-24"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" public String toString() {","lastModifiedDate":"2024-02-24"},{"lineNumber":38,"author":{"gitId":"ForAeons"},"content":" return value;","lastModifiedDate":"2024-02-24"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":41,"author":{"gitId":"ForAeons"},"content":" @Override","lastModifiedDate":"2024-02-24"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-24"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-24"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" return true;","lastModifiedDate":"2024-02-24"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":46,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-24"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof NusNet)) {","lastModifiedDate":"2024-02-24"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" return false;","lastModifiedDate":"2024-02-24"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":51,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" NusNet otherNusNet \u003d (NusNet) other;","lastModifiedDate":"2024-02-24"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" return this.value.equalsIgnoreCase(otherNusNet.value); // case insensitive","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" @Override","lastModifiedDate":"2024-02-24"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" public int hashCode() {","lastModifiedDate":"2024-02-24"},{"lineNumber":58,"author":{"gitId":"ForAeons"},"content":" return value.hashCode();","lastModifiedDate":"2024-02-24"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":"}","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"ForAeons":61}},{"path":"src/main/java/seedu/address/model/person/Person.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 seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2017-05-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"ForAeons"},"content":" private final NusNet nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" public Person(Name name, Phone phone, Email email, NusNet nusNet, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" requireAllNonNull(name, phone, email, address, tags);","lastModifiedDate":"2017-05-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" this.nusNet \u003d nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" public NusNet getNusNet() {","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" return nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" * Returns true if both persons have the same nusnet id.","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"ForAeons"},"content":" if (otherPerson \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"ForAeons"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"ForAeons"},"content":" // NUSNET is used as the unique identifier for a person","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"ForAeons"},"content":" return otherPerson.getNusNet().equals(this.getNusNet());","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":94,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":95,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":98,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":100,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" \u0026\u0026 nusNet.equals(otherPerson.nusNet)","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":115,"author":{"gitId":"ForAeons"},"content":" return Objects.hash(name, phone, email, nusNet, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":124,"author":{"gitId":"ForAeons"},"content":" .add(\"nusNet\", nusNet)","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":130,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":112,"ForAeons":18}},{"path":"src/main/java/seedu/address/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.util;","lastModifiedDate":"2016-12-20"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2016-12-20"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2016-12-20"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2016-12-20"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-20"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2016-12-20"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-14"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" new Person(new Name(\"Alex Yeoh\"), new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"E1234567\"), new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Person(new Name(\"Bernice Yu\"), new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":27,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"e2345678\"), new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"E3456789\"), new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" new Person(new Name(\"David Li\"), new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"e0000001\"), new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"E0000002\"), new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"e0000003\"), new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":41,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"-":54,"ForAeons":7}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" private final String nusNet;","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"nusNet\") String nusNet,","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"ForAeons"},"content":" @JsonProperty(\"address\") String address, @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags) {","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" this.nusNet \u003d nusNet;","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" nusNet \u003d source.getNusNet().value;","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"ForAeons"},"content":" if (nusNet \u003d\u003d null) {","lastModifiedDate":"2024-02-26"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, NusNet.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":" if (!NusNet.isValidNusNet(nusNet)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" throw new IllegalValueException(NusNet.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" final NusNet modelNusNet \u003d new NusNet(nusNet);","lastModifiedDate":"2024-02-26"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"ForAeons"},"content":" return new Person(modelName, modelPhone, modelEmail, modelNusNet, modelAddress, modelTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":106,"ForAeons":15}},{"path":"src/main/java/seedu/address/ui/PersonCard.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.ui;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Comparator;","lastModifiedDate":"2019-01-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-01-02"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.FlowPane;","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.HBox;","lastModifiedDate":"2016-09-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * An UI component that displays information of a {@code Person}.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class PersonCard extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListCard.fxml\";","lastModifiedDate":"2016-09-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Note: Certain keywords such as \"location\" and \"resources\" are reserved keywords in JavaFX.","lastModifiedDate":"2017-03-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * As a consequence, UI elements\u0027 variable names cannot be set to such keywords","lastModifiedDate":"2017-03-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * or an exception will be thrown by JavaFX during runtime.","lastModifiedDate":"2017-03-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @see \u003ca href\u003d\"https://github.com/se-edu/addressbook-level4/issues/336\"\u003eThe issue on AddressBook level 4\u003c/a\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public final Person person;","lastModifiedDate":"2018-01-10"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private HBox cardPane;","lastModifiedDate":"2016-09-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Label name;","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private Label id;","lastModifiedDate":"2016-09-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Label phone;","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Label address;","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Label email;","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" private Label nusNet;","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":" @FXML","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private FlowPane tags;","lastModifiedDate":"2016-12-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Creates a {@code PersonCode} with the given {@code Person} and index to display.","lastModifiedDate":"2020-05-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2018-01-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2017-07-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" id.setText(displayedIndex + \". \");","lastModifiedDate":"2016-09-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" name.setText(person.getName().fullName);","lastModifiedDate":"2017-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" phone.setText(person.getPhone().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" address.setText(person.getAddress().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" email.setText(person.getEmail().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" nusNet.setText(person.getNusNet().value);","lastModifiedDate":"2024-02-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" person.getTags().stream()","lastModifiedDate":"2019-01-02"},{"lineNumber":59,"author":{"gitId":"-"},"content":" .sorted(Comparator.comparing(tag -\u003e tag.tagName))","lastModifiedDate":"2019-01-02"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .forEach(tag -\u003e tags.getChildren().add(new Label(tag.tagName)));","lastModifiedDate":"2019-01-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":62,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"-":59,"ForAeons":3}},{"path":"src/main/resources/view/PersonListCard.fxml","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.FlowPane?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.Region?\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cHBox id\u003d\"cardPane\" fx:id\u003d\"cardPane\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2023-07-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cGridPane HBox.hgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" prefWidth\u003d\"150\" /\u003e","lastModifiedDate":"2017-03-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cVBox alignment\u003d\"CENTER_LEFT\" minHeight\u003d\"105\" GridPane.columnIndex\u003d\"0\"\u003e","lastModifiedDate":"2017-03-28"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cpadding\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"5\" bottom\u003d\"5\" left\u003d\"15\" /\u003e","lastModifiedDate":"2017-03-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003c/padding\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cHBox spacing\u003d\"5\" alignment\u003d\"CENTER_LEFT\"\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"id\" styleClass\u003d\"cell_big_label\"\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cminWidth\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003c!-- Ensures that the label text is never truncated --\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cRegion fx:constant\u003d\"USE_PREF_SIZE\" /\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/minWidth\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/Label\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"name\" text\u003d\"\\$first\" styleClass\u003d\"cell_big_label\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2016-09-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cFlowPane fx:id\u003d\"tags\" /\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":" \u003cLabel fx:id\u003d\"nusNet\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$nusNet\" /\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/GridPane\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"\u003c/HBox\u003e","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"-":36,"ForAeons":1}},{"path":"src/test/java/seedu/address/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2016-09-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NUSNET_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.CommandResult;","lastModifiedDate":"2017-01-18"},{"lineNumber":24,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.ListPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2016-09-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2016-09-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-31"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonAddressBookStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonUserPrefsStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import seedu.address.storage.StorageManager;","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":64,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":70,"author":{"gitId":"ForAeons"},"content":" String listCommand \u003d ListPersonCommand.COMMAND_WORD;","lastModifiedDate":"2024-02-26"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" assertCommandSuccess(listCommand, ListPersonCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2024-02-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":123,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":125,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":131,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":137,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":138,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":149,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":150,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":155,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":160,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":166,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":168,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"ForAeons"},"content":" String addCommand \u003d AddPersonCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY","lastModifiedDate":"2024-02-26"},{"lineNumber":170,"author":{"gitId":"ForAeons"},"content":" + EMAIL_DESC_AMY + NUSNET_DESC_AMY + ADDRESS_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":171,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":173,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":174,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":176,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"-":169,"ForAeons":7}},{"path":"src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2017-07-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2017-07-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-15"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-06-15"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-06-15"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code AddCommand}.","lastModifiedDate":"2017-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class AddCommandIntegrationTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_newPerson_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" expectedModel.addPerson(validPerson);","lastModifiedDate":"2017-06-15"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" assertCommandSuccess(new AddPersonCommand(validPerson), model,","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" String.format(AddPersonCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" expectedModel);","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(0);","lastModifiedDate":"2018-01-10"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" assertCommandFailure(new AddPersonCommand(personInList), model,","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"-":44,"ForAeons":4}},{"path":"src/test/java/seedu/address/logic/commands/AddCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-01-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-05-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2018-11-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-05-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-05-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-05-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2017-05-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyUserPrefs;","lastModifiedDate":"2018-11-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-05-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-05-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class AddCommandTest {","lastModifiedDate":"2017-05-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void constructor_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" assertThrows(NullPointerException.class, () -\u003e new AddPersonCommand(null));","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void execute_personAcceptedByModel_addSuccessful() throws Exception {","lastModifiedDate":"2017-05-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" ModelStubAcceptingPersonAdded modelStub \u003d new ModelStubAcceptingPersonAdded();","lastModifiedDate":"2017-05-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" CommandResult commandResult \u003d new AddPersonCommand(validPerson).execute(modelStub);","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" assertEquals(String.format(AddPersonCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" commandResult.getFeedbackToUser());","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertEquals(Arrays.asList(validPerson), modelStub.personsAdded);","lastModifiedDate":"2017-05-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addCommand \u003d new AddPersonCommand(validPerson);","lastModifiedDate":"2024-02-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" ModelStub modelStub \u003d new ModelStubWithPerson(validPerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" assertThrows(CommandException.class,","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand.MESSAGE_DUPLICATE_PERSON, () -\u003e addCommand.execute(modelStub));","lastModifiedDate":"2024-02-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Person alice \u003d new PersonBuilder().withName(\"Alice\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Person bob \u003d new PersonBuilder().withName(\"Bob\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addAliceCommand \u003d new AddPersonCommand(alice);","lastModifiedDate":"2024-02-26"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addBobCommand \u003d new AddPersonCommand(bob);","lastModifiedDate":"2024-02-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addAliceCommandCopy \u003d new AddPersonCommand(alice);","lastModifiedDate":"2024-02-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommandCopy));","lastModifiedDate":"2017-06-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(1));","lastModifiedDate":"2017-06-22"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(null));","lastModifiedDate":"2017-06-22"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(addBobCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addCommand \u003d new AddPersonCommand(ALICE);","lastModifiedDate":"2024-02-26"},{"lineNumber":84,"author":{"gitId":"ForAeons"},"content":" String expected \u003d AddPersonCommand.class.getCanonicalName() + \"{toAdd\u003d\" + ALICE + \"}\";","lastModifiedDate":"2024-02-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertEquals(expected, addCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * A default model stub that have all of the methods failing.","lastModifiedDate":"2017-05-12"},{"lineNumber":90,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private class ModelStub implements Model {","lastModifiedDate":"2017-05-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":94,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2018-11-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":104,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":109,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":114,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-11-27"},{"lineNumber":119,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":124,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void setAddressBook(ReadOnlyAddressBook newData) {","lastModifiedDate":"2018-11-27"},{"lineNumber":129,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":137,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-06"},{"lineNumber":139,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":142,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":143,"author":{"gitId":"-"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2018-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":147,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":148,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":149,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":152,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":153,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":154,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":157,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":158,"author":{"gitId":"-"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2018-01-10"},{"lineNumber":159,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":160,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":163,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":164,"author":{"gitId":"-"},"content":" * A Model stub that contains a single person.","lastModifiedDate":"2018-08-07"},{"lineNumber":165,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":166,"author":{"gitId":"-"},"content":" private class ModelStubWithPerson extends ModelStub {","lastModifiedDate":"2018-08-07"},{"lineNumber":167,"author":{"gitId":"-"},"content":" private final Person person;","lastModifiedDate":"2018-08-07"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":169,"author":{"gitId":"-"},"content":" ModelStubWithPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":170,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":171,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2018-08-07"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":176,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":" return this.person.isSamePerson(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":181,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":" * A Model stub that always accept the person being added.","lastModifiedDate":"2017-05-12"},{"lineNumber":183,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":184,"author":{"gitId":"-"},"content":" private class ModelStubAcceptingPersonAdded extends ModelStub {","lastModifiedDate":"2017-05-12"},{"lineNumber":185,"author":{"gitId":"-"},"content":" final ArrayList\u003cPerson\u003e personsAdded \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2017-05-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":187,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-07"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":189,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":190,"author":{"gitId":"-"},"content":" return personsAdded.stream().anyMatch(person::isSamePerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":193,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":194,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-08"},{"lineNumber":195,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":196,"author":{"gitId":"-"},"content":" personsAdded.add(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":197,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-04"},{"lineNumber":201,"author":{"gitId":"-"},"content":" return new AddressBook();","lastModifiedDate":"2017-05-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":205,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-12"}],"authorContributionMap":{"-":194,"ForAeons":11}},{"path":"src/test/java/seedu/address/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" public static final String VALID_NUSNET_AMY \u003d \"e1111111\";","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" public static final String VALID_NUSNET_BOB \u003d \"e2222222\";","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" public static final String NUSNET_DESC_AMY \u003d \" \" + PREFIX_NUSNET + VALID_NUSNET_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" public static final String NUSNET_DESC_BOB \u003d \" \" + PREFIX_NUSNET + VALID_NUSNET_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public static final String INVALID_NAME_DESC \u003d \" \" + PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2017-07-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \" + PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2017-07-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \" + PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-07-05"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" public static final String INVALID_NUSNET_DESC \u003d \" \" + PREFIX_NUSNET + \"e1111111a\"; // \u0027a\u0027 not allowed in nusnet","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \" + PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2017-07-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final String INVALID_TAG_DESC \u003d \" \" + PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2017-07-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" public static final EditPersonCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2024-02-26"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" public static final EditPersonCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2024-02-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":85,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":89,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":114,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":129,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"-":126,"ForAeons":8}},{"path":"src/test/java/seedu/address/logic/commands/DeleteCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2018-01-31"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for","lastModifiedDate":"2020-12-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * {@code DeleteCommand}.","lastModifiedDate":"2018-01-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class DeleteCommandTest {","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void execute_validIndexUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(DeletePersonCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void execute_invalidIndexUnfilteredList_throwsCommandException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-06-05"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(outOfBoundIndex);","lastModifiedDate":"2024-02-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_validIndexFilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(DeletePersonCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" showNoPerson(expectedModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void execute_invalidIndexFilteredList_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-06-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-06-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-06-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":77,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(outOfBoundIndex);","lastModifiedDate":"2024-02-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":84,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteFirstCommand \u003d new DeletePersonCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":85,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteSecondCommand \u003d new DeletePersonCommand(INDEX_SECOND_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteFirstCommandCopy \u003d new DeletePersonCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":94,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(deleteSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Index targetIndex \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(targetIndex);","lastModifiedDate":"2024-02-26"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":" String expected \u003d DeletePersonCommand.class.getCanonicalName() + \"{targetIndex\u003d\" + targetIndex + \"}\";","lastModifiedDate":"2024-02-26"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(expected, deleteCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show no one.","lastModifiedDate":"2017-06-05"},{"lineNumber":114,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":115,"author":{"gitId":"-"},"content":" private void showNoPerson(Model model) {","lastModifiedDate":"2017-06-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(p -\u003e false);","lastModifiedDate":"2017-06-12"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertTrue(model.getFilteredPersonList().isEmpty());","lastModifiedDate":"2018-02-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"-":109,"ForAeons":11}},{"path":"src/test/java/seedu/address/logic/commands/EditCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2018-01-31"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-05-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-05-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-05-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for EditCommand.","lastModifiedDate":"2020-12-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"public class EditCommandTest {","lastModifiedDate":"2017-05-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void execute_allFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(editedPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" Messages.format(editedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void execute_someFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Index indexLastPerson \u003d Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Person lastPerson \u003d model.getFilteredPersonList().get(indexLastPerson.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":58,"author":{"gitId":"-"},"content":" PersonBuilder personInList \u003d new PersonBuilder(lastPerson);","lastModifiedDate":"2017-05-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Person editedPerson \u003d personInList.withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":64,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(indexLastPerson, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" Messages.format(editedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":" expectedModel.setPerson(lastPerson, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void execute_noFieldSpecifiedUnfilteredList_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":77,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON, new EditPersonDescriptor());","lastModifiedDate":"2024-02-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Person editedPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":80,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" Messages.format(editedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public void execute_filteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":92,"author":{"gitId":"-"},"content":" Person personInFilteredList \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder(personInFilteredList).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":94,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2024-02-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":97,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":98,"author":{"gitId":"ForAeons"},"content":" Messages.format(editedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":100,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":103,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Person firstPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":109,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(firstPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_SECOND_PERSON, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"ForAeons"},"content":" assertCommandFailure(editCommand, model, EditPersonCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":115,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":117,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // edit person in filtered list into a duplicate in address book","lastModifiedDate":"2017-05-18"},{"lineNumber":120,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(INDEX_SECOND_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":121,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2024-02-26"},{"lineNumber":122,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder(personInList).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":124,"author":{"gitId":"ForAeons"},"content":" assertCommandFailure(editCommand, model, EditPersonCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":129,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-05-18"},{"lineNumber":130,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-22"},{"lineNumber":131,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(outOfBoundIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":136,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-18"},{"lineNumber":137,"author":{"gitId":"-"},"content":" * Edit filtered list where index is larger than size of filtered list,","lastModifiedDate":"2017-05-18"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * but smaller than size of address book","lastModifiedDate":"2017-05-18"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-18"},{"lineNumber":140,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":141,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":142,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-18"},{"lineNumber":144,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-05-18"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":147,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(outOfBoundIndex,","lastModifiedDate":"2024-02-26"},{"lineNumber":148,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":150,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":153,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":155,"author":{"gitId":"ForAeons"},"content":" final EditPersonCommand standardCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON, DESC_AMY);","lastModifiedDate":"2024-02-26"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":" EditPersonDescriptor copyDescriptor \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-08"},{"lineNumber":159,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand commandWithSameValues \u003d new EditPersonCommand(INDEX_FIRST_PERSON, copyDescriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":160,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(commandWithSameValues));","lastModifiedDate":"2017-05-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(standardCommand));","lastModifiedDate":"2017-05-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":166,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(null));","lastModifiedDate":"2017-05-08"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":168,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":169,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new ClearCommand()));","lastModifiedDate":"2017-05-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":171,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":172,"author":{"gitId":"ForAeons"},"content":" assertFalse(standardCommand.equals(new EditPersonCommand(INDEX_SECOND_PERSON, DESC_AMY)));","lastModifiedDate":"2024-02-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // different descriptor -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":175,"author":{"gitId":"ForAeons"},"content":" assertFalse(standardCommand.equals(new EditPersonCommand(INDEX_FIRST_PERSON, DESC_BOB)));","lastModifiedDate":"2024-02-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":182,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(index, editPersonDescriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":183,"author":{"gitId":"ForAeons"},"content":" String expected \u003d EditPersonCommand.class.getCanonicalName() + \"{index\u003d\" + index + \", editPersonDescriptor\u003d\"","lastModifiedDate":"2024-02-26"},{"lineNumber":184,"author":{"gitId":"-"},"content":" + editPersonDescriptor + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":" assertEquals(expected, editCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-08"}],"authorContributionMap":{"-":163,"ForAeons":25}},{"path":"src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptorWithSameValues \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(DESC_AMY));","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(null));","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(5));","lastModifiedDate":"2017-05-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(DESC_BOB));","lastModifiedDate":"2017-05-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String expected \u003d EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getName().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" + editPersonDescriptor.getNusNet().orElse(null) + \", nusNet\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", address\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getAddress().orElse(null) + \", tags\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getTags().orElse(null) + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":70,"ForAeons":2}},{"path":"src/test/java/seedu/address/logic/commands/FindCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_PERSONS_LISTED_OVERVIEW;","lastModifiedDate":"2023-07-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2018-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.CARL;","lastModifiedDate":"2017-07-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ELLE;","lastModifiedDate":"2017-07-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.FIONA;","lastModifiedDate":"2017-07-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code FindCommand}.","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class FindCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Model expectedModel \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2018-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-06-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"first\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate secondPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"second\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand findFirstCommand \u003d new FindPersonCommand(firstPredicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand findSecondCommand \u003d new FindPersonCommand(secondPredicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand findFirstCommandCopy \u003d new FindPersonCommand(firstPredicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(findSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void execute_zeroKeywords_noPersonFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":59,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 0);","lastModifiedDate":"2017-06-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\" \");","lastModifiedDate":"2018-08-08"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand command \u003d new FindPersonCommand(predicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertEquals(Collections.emptyList(), model.getFilteredPersonList());","lastModifiedDate":"2018-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void execute_multipleKeywords_multiplePersonsFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 3);","lastModifiedDate":"2017-06-12"},{"lineNumber":70,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\"Kurz Elle Kunz\");","lastModifiedDate":"2018-08-08"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand command \u003d new FindPersonCommand(predicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertEquals(Arrays.asList(CARL, ELLE, FIONA), model.getFilteredPersonList());","lastModifiedDate":"2018-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"keyword\"));","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand findCommand \u003d new FindPersonCommand(predicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" String expected \u003d FindPersonCommand.class.getCanonicalName() + \"{predicate\u003d\" + predicate + \"}\";","lastModifiedDate":"2024-02-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertEquals(expected, findCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-12"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Parses {@code userInput} into a {@code NameContainsKeywordsPredicate}.","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private NameContainsKeywordsPredicate preparePredicate(String userInput) {","lastModifiedDate":"2018-08-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return new NameContainsKeywordsPredicate(Arrays.asList(userInput.split(\"\\\\s+\")));","lastModifiedDate":"2018-08-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"-":84,"ForAeons":7}},{"path":"src/test/java/seedu/address/logic/commands/ListCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2017-07-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2018-01-31"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2018-01-31"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for ListCommand.","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class ListCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private Model expectedModel;","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_listIsNotFiltered_showsSameList() {","lastModifiedDate":"2017-08-15"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" assertCommandSuccess(new ListPersonCommand(), model, ListPersonCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void execute_listIsFiltered_showsEverything() {","lastModifiedDate":"2017-08-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" assertCommandSuccess(new ListPersonCommand(), model, ListPersonCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"-":37,"ForAeons":2}},{"path":"src/test/java/seedu/address/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NUSNET_DESC;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NUSNET_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NUSNET_DESC_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2017-12-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2017-12-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-07-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-06-15"},{"lineNumber":45,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-06-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":49,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-06-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-06-15"},{"lineNumber":51,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":53,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" private AddPersonCommandParser parser \u003d new AddPersonCommandParser();","lastModifiedDate":"2024-02-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2018-07-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" + NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"ForAeons"},"content":" + PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"ForAeons"},"content":" + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" + TAG_DESC_FRIEND, new AddPersonCommand(expectedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":70,"author":{"gitId":"-"},"content":" // multiple tags - all accepted","lastModifiedDate":"2017-06-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)","lastModifiedDate":"2018-07-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"ForAeons"},"content":" NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + NUSNET_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"ForAeons"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"ForAeons"},"content":" new AddPersonCommand(expectedPersonMultipleTags));","lastModifiedDate":"2024-02-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + NUSNET_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND;","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":86,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertParseFailure(parser, ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_AMY + NAME_DESC_AMY + ADDRESS_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"-"},"content":" + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS,","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" PREFIX_NUSNET, PREFIX_PHONE, PREFIX_EMAIL));","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":110,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":112,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":" // valid value followed by invalid value","lastModifiedDate":"2023-07-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":128,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NAME_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":130,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_EMAIL_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":136,"author":{"gitId":"ForAeons"},"content":" // invalid nusnet","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NUSNET_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":138,"author":{"gitId":"ForAeons"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NUSNET));","lastModifiedDate":"2024-02-25"},{"lineNumber":139,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":140,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PHONE_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":142,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":144,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_ADDRESS_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":146,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":153,"author":{"gitId":"ForAeons"},"content":" assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":154,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_AMY + ADDRESS_DESC_AMY,","lastModifiedDate":"2024-02-25"},{"lineNumber":155,"author":{"gitId":"ForAeons"},"content":" new AddPersonCommand(expectedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddPersonCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-02-26"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":162,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":170,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":175,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":178,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":179,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":183,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":184,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":185,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":186,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":187,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":188,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":190,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":191,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":192,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":193,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":195,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":196,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":200,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":201,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":205,"author":{"gitId":"ForAeons"},"content":" // invalid nusnet","lastModifiedDate":"2024-02-25"},{"lineNumber":206,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":207,"author":{"gitId":"ForAeons"},"content":" + INVALID_NUSNET_DESC + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":208,"author":{"gitId":"ForAeons"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, NusNet.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":209,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":210,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2017-06-15"},{"lineNumber":211,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":212,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":213,"author":{"gitId":"-"},"content":" + INVALID_TAG_DESC + VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":215,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":216,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":217,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":218,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":222,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"ForAeons"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddPersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":224,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":225,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"-":176,"ForAeons":49}},{"path":"src/test/java/seedu/address/logic/parser/AddressBookParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-06-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ClearCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.DeletePersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ExitCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.FindPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.HelpCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.ListPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-05-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-06-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonUtil;","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"public class AddressBookParserTest {","lastModifiedDate":"2017-07-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private final AddressBookParser parser \u003d new AddressBookParser();","lastModifiedDate":"2017-07-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void parseCommand_add() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand command \u003d (AddPersonCommand) parser.parseCommand(PersonUtil.getAddCommand(person));","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" assertEquals(new AddPersonCommand(person), command);","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void parseCommand_clear() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD) instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD + \" 3\") instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void parseCommand_delete() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand command \u003d (DeletePersonCommand) parser.parseCommand(","lastModifiedDate":"2024-02-26"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand.COMMAND_WORD + \" \" + INDEX_FIRST_PERSON.getOneBased());","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" assertEquals(new DeletePersonCommand(INDEX_FIRST_PERSON), command);","lastModifiedDate":"2024-02-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void parseCommand_edit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(person).build();","lastModifiedDate":"2017-06-27"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand command \u003d (EditPersonCommand) parser.parseCommand(EditPersonCommand.COMMAND_WORD + \" \"","lastModifiedDate":"2024-02-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" + INDEX_FIRST_PERSON.getOneBased() + \" \" + PersonUtil.getEditPersonDescriptorDetails(descriptor));","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" assertEquals(new EditPersonCommand(INDEX_FIRST_PERSON, descriptor), command);","lastModifiedDate":"2024-02-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void parseCommand_exit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD) instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD + \" 3\") instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void parseCommand_find() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d Arrays.asList(\"foo\", \"bar\", \"baz\");","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand command \u003d (FindPersonCommand) parser.parseCommand(","lastModifiedDate":"2024-02-26"},{"lineNumber":75,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand.COMMAND_WORD + \" \" + keywords.stream().collect(Collectors.joining(\" \")));","lastModifiedDate":"2024-02-26"},{"lineNumber":76,"author":{"gitId":"ForAeons"},"content":" assertEquals(new FindPersonCommand(new NameContainsKeywordsPredicate(keywords)), command);","lastModifiedDate":"2024-02-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void parseCommand_help() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD) instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD + \" 3\") instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void parseCommand_list() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"ForAeons"},"content":" assertTrue(parser.parseCommand(ListPersonCommand.COMMAND_WORD) instanceof ListPersonCommand);","lastModifiedDate":"2024-02-26"},{"lineNumber":88,"author":{"gitId":"ForAeons"},"content":" assertTrue(parser.parseCommand(ListPersonCommand.COMMAND_WORD + \" 3\") instanceof ListPersonCommand);","lastModifiedDate":"2024-02-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void parseCommand_unrecognisedInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE), ()","lastModifiedDate":"2019-03-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" -\u003e parser.parseCommand(\"\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public void parseCommand_unknownCommand_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_UNKNOWN_COMMAND, () -\u003e parser.parseCommand(\"unknownCommand\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"-":83,"ForAeons":18}},{"path":"src/test/java/seedu/address/logic/parser/DeleteCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-09"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":10,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.DeletePersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * As we are only doing white-box testing, our test cases do not cover path variations","lastModifiedDate":"2017-06-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * outside of the DeleteCommand code. For example, inputs \"1\" and \"1 abc\" take the","lastModifiedDate":"2017-06-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * same path through the DeleteCommand, and therefore we test only one of them.","lastModifiedDate":"2017-06-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The path variation for those two cases occur inside the ParserUtil, and","lastModifiedDate":"2017-06-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * therefore should be covered by the ParserUtilTest.","lastModifiedDate":"2017-06-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class DeleteCommandParserTest {","lastModifiedDate":"2017-06-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":21,"author":{"gitId":"ForAeons"},"content":" private DeletePersonCommandParser parser \u003d new DeletePersonCommandParser();","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsDeleteCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" assertParseSuccess(parser, \"1\", new DeletePersonCommand(INDEX_FIRST_PERSON));","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void parse_invalidArgs_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, \"a\", String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"-":28,"ForAeons":5}},{"path":"src/test/java/seedu/address/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-05-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private static final String TAG_EMPTY \u003d \" \" + PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditPersonCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-02-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" private EditPersonCommandParser parser \u003d new EditPersonCommandParser();","lastModifiedDate":"2024-02-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":63,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, \"1\", EditPersonCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2024-02-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"-5\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"0\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 i/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2018-09-22"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2018-09-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2018-09-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address","lastModifiedDate":"2018-09-22"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2018-09-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC + EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":95,"author":{"gitId":"-"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2017-05-04"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2017-05-04"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_DESC_HUSBAND + TAG_EMPTY, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_EMPTY + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + TAG_EMPTY + TAG_DESC_FRIEND + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ADDRESS_AMY + VALID_PHONE_AMY,","lastModifiedDate":"2017-07-06"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + TAG_DESC_HUSBAND","lastModifiedDate":"2017-06-06"},{"lineNumber":110,"author":{"gitId":"-"},"content":" + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND;","lastModifiedDate":"2017-06-06"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":112,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":115,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":120,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":121,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":122,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":127,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":134,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":135,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":136,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + NAME_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":137,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":138,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":141,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":142,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":143,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":144,"author":{"gitId":"ForAeons"},"content":" expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":147,"author":{"gitId":"-"},"content":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":149,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":150,"author":{"gitId":"ForAeons"},"content":" expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // address","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + ADDRESS_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":155,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(VALID_ADDRESS_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":156,"author":{"gitId":"ForAeons"},"content":" expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":159,"author":{"gitId":"-"},"content":" // tags","lastModifiedDate":"2017-05-04"},{"lineNumber":160,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + TAG_DESC_FRIEND;","lastModifiedDate":"2017-05-25"},{"lineNumber":161,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":162,"author":{"gitId":"ForAeons"},"content":" expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":166,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":167,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":168,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":169,"author":{"gitId":"-"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2023-07-14"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":171,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":172,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":173,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + PHONE_DESC_BOB;","lastModifiedDate":"2023-07-14"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":175,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":177,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":178,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + INVALID_PHONE_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":180,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":182,"author":{"gitId":"-"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":183,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2023-07-14"},{"lineNumber":184,"author":{"gitId":"-"},"content":" + TAG_DESC_FRIEND + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY + TAG_DESC_FRIEND","lastModifiedDate":"2017-05-25"},{"lineNumber":185,"author":{"gitId":"-"},"content":" + PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND;","lastModifiedDate":"2017-05-25"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":188,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":191,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC","lastModifiedDate":"2023-07-14"},{"lineNumber":192,"author":{"gitId":"-"},"content":" + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":194,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":195,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":200,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":201,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2017-05-25"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2017-05-04"},{"lineNumber":204,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":206,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":208,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"-":195,"ForAeons":13}},{"path":"src/test/java/seedu/address/logic/parser/FindCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-27"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.FindPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommandParserTest {","lastModifiedDate":"2017-06-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":" private FindPersonCommandParser parser \u003d new FindPersonCommandParser();","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void parse_emptyArg_throwsParseException() {","lastModifiedDate":"2017-06-27"},{"lineNumber":20,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, \" \", String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsFindCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // no leading and trailing whitespaces","lastModifiedDate":"2017-06-27"},{"lineNumber":27,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand expectedFindCommand \u003d","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":" new FindPersonCommand(new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\")));","lastModifiedDate":"2024-02-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \"Alice Bob\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // multiple whitespaces between keywords","lastModifiedDate":"2017-06-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \" \\n Alice \\n \\t Bob \\t\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-27"}],"authorContributionMap":{"-":29,"ForAeons":6}},{"path":"src/test/java/seedu/address/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2018-03-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NUSNET_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2018-04-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2018-04-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-03-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class PersonTest {","lastModifiedDate":"2018-03-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2018-03-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void isSamePerson() {","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" // same nusnet, all other attributes different -\u003e returns true","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE)","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"ForAeons"},"content":" .withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" .withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" .withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"ForAeons"},"content":" .withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2020-12-18"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" // same nusnet, but different case -\u003e returns true","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"ForAeons"},"content":" Person nusnetUpperCase \u003d new PersonBuilder(ALICE)","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_BOB.toUpperCase())","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" Person nusnetLowerCase \u003d new PersonBuilder(ALICE)","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_BOB.toLowerCase())","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" assertTrue(nusnetUpperCase.isSamePerson(nusnetLowerCase));","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" // same name, all other attributes different -\u003e returns false","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" editedAlice \u003d new PersonBuilder(ALICE)","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" .withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" .withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" .withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":" .withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" Person aliceCopy \u003d new PersonBuilder(ALICE).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(aliceCopy));","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // different type -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(5));","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(BOB));","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-18"},{"lineNumber":99,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2018-04-18"},{"lineNumber":100,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2018-04-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-18"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + ALICE.getName() + \", phone\u003d\" + ALICE.getPhone()","lastModifiedDate":"2019-02-23"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" + \", email\u003d\" + ALICE.getEmail() + \", nusNet\u003d\" + ALICE.getNusNet() + \", address\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":" + ALICE.getAddress() + \", tags\u003d\" + ALICE.getTags() + \"}\";","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(expected, ALICE.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"-":84,"ForAeons":27}},{"path":"src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.storage.JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"ForAeons"},"content":" private static final String INVALID_NUSNET \u003d \"E012345\";","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d BENSON.getName().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d BENSON.getPhone().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d BENSON.getEmail().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" private static final String VALID_NUSNET \u003d BENSON.getNusNet().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d BENSON.getAddress().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d BENSON.getTags().stream()","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(BENSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertEquals(BENSON, person.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" VALID_NUSNET, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"ForAeons"},"content":" VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"ForAeons"},"content":" VALID_NUSNET, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_NUSNET, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null,","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"ForAeons"},"content":" VALID_NUSNET, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":90,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"ForAeons"},"content":" INVALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" VALID_NUSNET, null, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":117,"author":{"gitId":"ForAeons"},"content":" VALID_ADDRESS, invalidTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"ForAeons"},"content":" @Test","lastModifiedDate":"2024-02-25"},{"lineNumber":122,"author":{"gitId":"ForAeons"},"content":" public void toModelType_invalidNusNet_throwsIllegalValueException() {","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"ForAeons"},"content":" VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":126,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d NusNet.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2024-02-25"},{"lineNumber":127,"author":{"gitId":"ForAeons"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-02-25"},{"lineNumber":128,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":130,"author":{"gitId":"ForAeons"},"content":" @Test","lastModifiedDate":"2024-02-25"},{"lineNumber":131,"author":{"gitId":"ForAeons"},"content":" public void toModelType_nullNusNet_throwsIllegalValueException() {","lastModifiedDate":"2024-02-25"},{"lineNumber":132,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"ForAeons"},"content":" null, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":134,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, NusNet.class.getSimpleName());","lastModifiedDate":"2024-02-25"},{"lineNumber":135,"author":{"gitId":"ForAeons"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-02-25"},{"lineNumber":136,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":138,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":101,"ForAeons":37}},{"path":"src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-12-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-12-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-12-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-12-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-12-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"ForAeons"},"content":" descriptor.setNusNet(person.getNusNet());","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" * Sets the {@code NusNet} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"ForAeons"},"content":" public EditPersonDescriptorBuilder withNusNet(String nusNet) {","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" descriptor.setNusNet(new seedu.address.model.person.NusNet(nusNet));","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"ForAeons"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":88,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagSet \u003d Stream.of(tags).map(Tag::new).collect(Collectors.toSet());","lastModifiedDate":"2017-12-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" descriptor.setTags(tagSet);","lastModifiedDate":"2017-12-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":96,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":86,"ForAeons":10}},{"path":"src/test/java/seedu/address/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-01-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-01-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-01-18"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-04-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-01-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-04-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.util.SampleDataUtil;","lastModifiedDate":"2017-04-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":23,"author":{"gitId":"ForAeons"},"content":" public static final String DEAULT_NUSNET \u003d \"E0123456\";","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" private NusNet nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" nusNet \u003d new NusNet(DEAULT_NUSNET);","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" nusNet \u003d personToCopy.getNusNet();","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":77,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":85,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":97,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"ForAeons"},"content":" * Sets the {@code NusNet} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"ForAeons"},"content":" public PersonBuilder withNusNet(String nusNet) {","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"ForAeons"},"content":" this.nusNet \u003d new NusNet(nusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" return new Person(name, phone, email, nusNet, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"-":95,"ForAeons":14}},{"path":"src/test/java/seedu/address/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-04-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-05-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":6,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-03-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-03-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":26,"author":{"gitId":"ForAeons"},"content":" return AddPersonCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2024-02-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":33,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" sb.append(PREFIX_NUSNET + person.getNusNet().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {","lastModifiedDate":"2018-03-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2018-03-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2018-03-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" tags.forEach(s -\u003e sb.append(PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"-":59,"ForAeons":5}},{"path":"src/test/java/seedu/address/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NUSNET_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NUSNET_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-08-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-08-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-09-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":" public static final Person ALICE \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" .withName(\"Alice Pauline\")","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\")","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"alice@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000001\")","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":" .withTags(\"friends\")","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" public static final Person BENSON \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" .withName(\"Benson Meier\")","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\")","lastModifiedDate":"2017-09-21"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"johnd@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000002\")","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"98765432\")","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" .withTags(\"owesMoney\", \"friends\")","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" public static final Person CARL \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" .withName(\"Carl Kurz\")","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"95352563\")","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"heinz@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000003\")","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"wall street\")","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"ForAeons"},"content":" public static final Person DANIEL \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" .withName(\"Daniel Meier\")","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"87652533\")","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"cornelia@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"10th street\")","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000004\")","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" .withTags(\"friends\")","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" public static final Person ELLE \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":" .withName(\"Elle Meyer\")","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"9482224\")","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"werner@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000005\")","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"michegan ave\")","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" public static final Person FIONA \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" .withName(\"Fiona Kunz\")","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"9482427\")","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"lydia@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000006\")","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"little tokyo\")","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"ForAeons"},"content":" public static final Person GEORGE \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"ForAeons"},"content":" .withName(\"George Best\")","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"9482442\")","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"anna@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000007\")","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"4th street\")","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":82,"author":{"gitId":"ForAeons"},"content":" public static final Person HOON \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"ForAeons"},"content":" .withName(\"Hoon Meier\")","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"8482424\")","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"stefan@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000008\")","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"little india\")","lastModifiedDate":"2024-02-25"},{"lineNumber":88,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"ForAeons"},"content":" public static final Person IDA \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":90,"author":{"gitId":"ForAeons"},"content":" .withName(\"Ida Mueller\")","lastModifiedDate":"2024-02-25"},{"lineNumber":91,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"8482131\")","lastModifiedDate":"2024-02-25"},{"lineNumber":92,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"hans@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":93,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000009\")","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"chicago ave\")","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":98,"author":{"gitId":"ForAeons"},"content":" public static final Person AMY \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"ForAeons"},"content":" .withName(VALID_NAME_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"ForAeons"},"content":" .withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"ForAeons"},"content":" .withEmail(VALID_EMAIL_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" .withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":" .withTags(VALID_TAG_FRIEND)","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" public static final Person BOB \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" .withName(VALID_NAME_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":" .withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"ForAeons"},"content":" .withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"ForAeons"},"content":" .withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"ForAeons"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":115,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":119,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":123,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":125,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":131,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"-":52,"ForAeons":81}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F13-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F13-1/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F13-1/tp/graph/badge.svg?token\u003d58YEQ4Q1CC)](https://codecov.io/gh/AY2324S2-CS2103T-F13-1/tp)","lastModifiedDate":"2024-02-16"},{"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":"belligerentbeagle"},"content":"* TAPro is **a Contact Book application** that is made for Computer Science Tutors for managing their students contact and performance details.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"content":" * Add a student\u0027s contact details.","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":" * Record attendance of the student.","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"* For the detailed documentation of the original project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"belligerentbeagle":7,"-":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":"-"},"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":"belligerentbeagle"},"content":"### Ethan Wei Yuxin","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/belligerentbeagle.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"[[homepage](http://www.ethanwei.me)]","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"[[github](https://github.com/belligerentbeagle)]","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"[[portfolio](team/ethanwei.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"saiutkarsh33"},"content":"### Sai Utkarsh","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/saiutkarsh33.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"belligerentbeagle"},"content":"[[github](https://github.com/saiutkarsh33)]","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"tituschewxj"},"content":"[[portfolio](team/sai.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"belligerentbeagle"},"content":"### Titus Chew ","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/tituschewxj.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"belligerentbeagle"},"content":"[[github](http://github.com/tituschewxj)] ","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"belligerentbeagle"},"content":"[[portfolio](team/titus.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"tituschewxj"},"content":"### Wu Xiaoyun","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/foraeons.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"belligerentbeagle"},"content":"[[github](http://github.com/ForAeons)]","lastModifiedDate":"2024-02-29"},{"lineNumber":50,"author":{"gitId":"belligerentbeagle"},"content":"[[portfolio](team/xiaoyun.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":53,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"belligerentbeagle"},"content":"### Anant Shanker","lastModifiedDate":"2024-02-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"tituschewxj"},"content":"\u003cimg src\u003d\"images/anant1902.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"belligerentbeagle"},"content":"[[github](http://github.com/anant1902)]","lastModifiedDate":"2024-02-29"},{"lineNumber":61,"author":{"gitId":"belligerentbeagle"},"content":"[[portfolio](team/anant.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"belligerentbeagle"},"content":"* Role: Software Engineer","lastModifiedDate":"2024-02-29"},{"lineNumber":64,"author":{"gitId":"belligerentbeagle"},"content":"* Responsibilities: Software Development","lastModifiedDate":"2024-02-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"tituschewxj":7,"saiutkarsh33":1,"belligerentbeagle":23,"-":34}},{"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":"saiutkarsh33"},"content":"* Teaching Assistant for a Computer Science module in NUS ","lastModifiedDate":"2024-02-29"},{"lineNumber":277,"author":{"gitId":"saiutkarsh33"},"content":"* tech savvy ","lastModifiedDate":"2024-02-28"},{"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":"saiutkarsh33"},"content":"**Value proposition**: All in one Address book managing student’s progress in the course, by means of participation, grades, and other course specific attributes of an NUS CS class. Can quickly find information, filter and sort with keyboard shortcuts.","lastModifiedDate":"2024-02-28"},{"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":"saiutkarsh33"},"content":"|----------|---------|--------------|-----------------|","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | name/rename the CS course that I am tutoring this semester | keep track of the module I am teaching |","lastModifiedDate":"2024-02-28"},{"lineNumber":293,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | add a student to the CS course that I am tutoring that semester to my class | keep track of him or her |","lastModifiedDate":"2024-02-28"},{"lineNumber":294,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | view all students from my class | view details about all of them |","lastModifiedDate":"2024-02-28"},{"lineNumber":295,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | mark attendance for a student in my class | keep track of who\u0027s present |","lastModifiedDate":"2024-02-28"},{"lineNumber":296,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | unmark attendance for a student in my class | keep track of who is absent |","lastModifiedDate":"2024-02-28"},{"lineNumber":297,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | delete a student | remove a student if he or she leaves the class |","lastModifiedDate":"2024-02-28"},{"lineNumber":298,"author":{"gitId":"saiutkarsh33"},"content":"| `* * *` | TA | know all the commands of the address book | use it effectively |","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"saiutkarsh33"},"content":"(For all use cases below, the **System** is the `TA Pro` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-02-29"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":308,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":310,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":311,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to delete a specific student based on NUSNet ID.","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to add a student, providing the name and NUSNet ID as compulsory information, with the phone number being optional.","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Name/Rename CS Course**","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to name or rename a CS course by specifying the course name and the new name if applicable.","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":331,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: View All Students**","lastModifiedDate":"2024-02-28"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to view a list of all students.","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Mark Attendance**","lastModifiedDate":"2024-02-28"},{"lineNumber":340,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":341,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":342,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":343,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to mark attendance for a student by providing the student\u0027s NUSNet ID; specifying the week is optional.","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":345,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":346,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":347,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Un-mark Attendance**","lastModifiedDate":"2024-02-29"},{"lineNumber":348,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":349,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":350,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":351,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to un-mark attendance for a student by providing the student\u0027s NUSNet ID; specifying the week is optional.","lastModifiedDate":"2024-02-29"},{"lineNumber":352,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":353,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":354,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":355,"author":{"gitId":"saiutkarsh33"},"content":"**Use case: Know Commands for the Address Book**","lastModifiedDate":"2024-02-28"},{"lineNumber":356,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":357,"author":{"gitId":"saiutkarsh33"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"saiutkarsh33"},"content":"1. User requests to view the list of available commands for the AddressBook.","lastModifiedDate":"2024-02-28"},{"lineNumber":360,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":361,"author":{"gitId":"saiutkarsh33"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":364,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"saiutkarsh33"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` installed.","lastModifiedDate":"2024-02-28"},{"lineNumber":381,"author":{"gitId":"saiutkarsh33"},"content":"2. System to load the main interface in under 1 second on standard educational institution hardware.","lastModifiedDate":"2024-02-28"},{"lineNumber":382,"author":{"gitId":"saiutkarsh33"},"content":"3. Application to be accessible on devices commonly used by the educational institution, such as desktop computers, laptops, and tablet.","lastModifiedDate":"2024-02-28"},{"lineNumber":383,"author":{"gitId":"saiutkarsh33"},"content":"4. System to ensure data integrity, with a goal of zero data loss over the academic year.","lastModifiedDate":"2024-02-28"},{"lineNumber":384,"author":{"gitId":"saiutkarsh33"},"content":"5. Input validation to prevent errors due to incorrect data entry.","lastModifiedDate":"2024-02-28"},{"lineNumber":385,"author":{"gitId":"saiutkarsh33"},"content":"6. Application to handle common errors gracefully, such as incorrect data entry, without crashing or losing data.","lastModifiedDate":"2024-02-28"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":392,"author":{"gitId":"saiutkarsh33"},"content":"* **CS**: Computer Science","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"saiutkarsh33"},"content":"* **NUS**: National University of Singapore","lastModifiedDate":"2024-02-29"},{"lineNumber":394,"author":{"gitId":"saiutkarsh33"},"content":"* **TA**: Teaching Assistant","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":404,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":405,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"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":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"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":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"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":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"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":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"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":439,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"saiutkarsh33":70,"-":379}},{"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":"belligerentbeagle"},"content":"# TAPro User Guide","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"TAPro is a **a Contact Book application** that is made for Computer Science Tutors for managing their students contact and performance details.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"TAPro is optimized for use via a **Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). ","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"If you can type fast, TAPro can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","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":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"1. Download the latest `tapro.jar` from [here](https://github.com/AY2324S2-CS2103T-F13-1/tp/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your TAPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"belligerentbeagle"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar tapro.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"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":30,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"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":33,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"belligerentbeagle"},"content":" * `addstu nn/e0952224 n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Contact Book.","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"belligerentbeagle"},"content":" * `delstu 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","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":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"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":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"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":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"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":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"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":68,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":70,"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":71,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"saiutkarsh33"},"content":"### Name/Rename CS course : `setcrs`","lastModifiedDate":"2024-02-28"},{"lineNumber":83,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":84,"author":{"gitId":"saiutkarsh33"},"content":"Names the course in question. ","lastModifiedDate":"2024-02-28"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":86,"author":{"gitId":"saiutkarsh33"},"content":"Format: `setcrs COURSE_NAME`","lastModifiedDate":"2024-02-28"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"saiutkarsh33"},"content":"Duplicate course are not allowed.","lastModifiedDate":"2024-02-28"},{"lineNumber":89,"author":{"gitId":"saiutkarsh33"},"content":"Courses are case-insensitive.","lastModifiedDate":"2024-02-28"},{"lineNumber":90,"author":{"gitId":"saiutkarsh33"},"content":"Course code should follow the format \"XX1234Y\", Y is optional.","lastModifiedDate":"2024-02-28"},{"lineNumber":91,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"saiutkarsh33"},"content":"### Adding a student: `addstu`","lastModifiedDate":"2024-03-07"},{"lineNumber":93,"author":{"gitId":"ForAeons"},"content":"Adds a student to the address book.","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"ForAeons"},"content":"Format: `addstu n/NAME p/PHONE_NUMBER e/EMAIL nn/NUSNET_ID a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","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":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":"* `addstu n/John Doe p/98765432 e/johnd@example.com nn/e1234567 a/John street, block 123, #01-01`","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":"* `add n/Betsy nn/e01234567 Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"Anant1902"},"content":"### Listing all students : `list`","lastModifiedDate":"2024-03-07"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"saiutkarsh33"},"content":"If there are additional arguments behind `list` we will simply ignore them.","lastModifiedDate":"2024-02-28"},{"lineNumber":113,"author":{"gitId":"saiutkarsh33"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":114,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"ForAeons"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [nn/NUSNET_ID] [t/TAG]…​`","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"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":121,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"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":124,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" specifying any tags after it.","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":"* `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":129,"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":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"Anant1902"},"content":"### Locating students by name: `find`","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"Anant1902"},"content":"### Marking a student\u0027s attendance for a given week by their NUSNet: `mark`","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"Anant1902"},"content":"Marks a student\u0027s attendance for a particular week.","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"Anant1902"},"content":"Format: `mark nn/NUSNET_ID wk/WEEK_NUMBER`","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"Anant1902"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"Anant1902"},"content":"* `mark nn/e1234567 wk/3`","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"Anant1902"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"Anant1902"},"content":"### Deleting a student : `delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"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":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"belligerentbeagle"},"content":"TAPro\u0027s 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-06"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":191,"author":{"gitId":"belligerentbeagle"},"content":"TAPro\u0027s 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-06"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":193,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"belligerentbeagle"},"content":"If your changes to the data file makes its format invalid, TAPro 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-06"},{"lineNumber":197,"author":{"gitId":"belligerentbeagle"},"content":"Furthermore, certain edits can cause the TAPro 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":"2024-03-06"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"belligerentbeagle"},"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 TAPro home folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":215,"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":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":217,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":219,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"ForAeons"},"content":"**Add Student** | `addstu n/NAME p/PHONE_NUMBER e/EMAIL nn/NUSNET_ID a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com nn/e1234567 a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2024-02-25"},{"lineNumber":224,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"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":227,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"saiutkarsh33":11,"belligerentbeagle":16,"-":183,"ForAeons":6,"Anant1902":13}},{"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":"belligerentbeagle"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eTAPro\u003c/a\u003e","lastModifiedDate":"2024-02-29"},{"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":{"belligerentbeagle":1,"-":66}},{"path":"docs/team/anant.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":"layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"belligerentbeagle"},"content":"title: \"Anant\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-29"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"belligerentbeagle":26}},{"path":"docs/team/ethanwei.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"belligerentbeagle"},"content":" title: \"Ethan Wei\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-28"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**: ","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"belligerentbeagle":26}},{"path":"docs/team/sai.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":"layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"belligerentbeagle"},"content":"title: \"Sai\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-29"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"belligerentbeagle":26}},{"path":"docs/team/titus.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":"layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"belligerentbeagle"},"content":"title: \"Titus\u0027 Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-29"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"belligerentbeagle":26}},{"path":"docs/team/xiaoyun.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"belligerentbeagle"},"content":"layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"ForAeons"},"content":"title: \"Xiaoyun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"belligerentbeagle"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"belligerentbeagle"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"belligerentbeagle"},"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-02-29"},{"lineNumber":9,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"belligerentbeagle"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"belligerentbeagle"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"belligerentbeagle"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"belligerentbeagle"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":" * Set up github milestones","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":" * Create and assign issues to team members","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"belligerentbeagle"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"belligerentbeagle"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"belligerentbeagle"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"belligerentbeagle"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"belligerentbeagle"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"belligerentbeagle"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"belligerentbeagle"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"belligerentbeagle":25,"ForAeons":3}},{"path":"src/main/java/seedu/address/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2023-07-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"ForAeons"},"content":"import java.util.ArrayList;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.Prefix;","lastModifiedDate":"2023-07-14"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" ArrayList\u003cString\u003e duplicateFieldsArray \u003d new ArrayList\u003c\u003e(duplicateFields);","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":" duplicateFieldsArray.sort(String::compareToIgnoreCase);","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"ForAeons"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFieldsArray);","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" .append(\"; NUSNET: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" .append(person.getNusNet())","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" .append(\"; Tags: \");","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" person.getTags().forEach(builder::append);","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":50,"ForAeons":7}},{"path":"src/main/java/seedu/address/logic/commands/AddPersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"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.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-05-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-01-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"ForAeons"},"content":"public class AddPersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":" public static final String COMMAND_WORD \u003d \"addstu\";","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" + PREFIX_NUSNET + \"NUSNET \"","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" + PREFIX_NUSNET + \"e0123456 \"","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"friends \"","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"owesMoney\";","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" public AddPersonCommand(Person person) {","lastModifiedDate":"2024-02-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof AddPersonCommand)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":77,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand otherAddCommand \u003d (AddPersonCommand) other;","lastModifiedDate":"2024-02-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":79,"ForAeons":8}},{"path":"src/main/java/seedu/address/logic/commands/DeletePersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-09-01"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Deletes a person identified using it\u0027s displayed index from the address book.","lastModifiedDate":"2018-04-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"public class DeletePersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"delete\";","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \": Deletes the person identified by the index number used in the displayed person list.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer)\\n\"","lastModifiedDate":"2016-09-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1\";","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_PERSON_SUCCESS \u003d \"Deleted Person: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final Index targetIndex;","lastModifiedDate":"2017-06-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" public DeletePersonCommand(Index targetIndex) {","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.targetIndex \u003d targetIndex;","lastModifiedDate":"2016-09-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (targetIndex.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Person personToDelete \u003d lastShownList.get(targetIndex.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" model.deletePerson(personToDelete);","lastModifiedDate":"2016-09-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_DELETE_PERSON_SUCCESS, Messages.format(personToDelete)));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof DeletePersonCommand)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand otherDeleteCommand \u003d (DeletePersonCommand) other;","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return targetIndex.equals(otherDeleteCommand.targetIndex);","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" .add(\"targetIndex\", targetIndex)","lastModifiedDate":"2019-02-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":65,"ForAeons":4}},{"path":"src/main/java/seedu/address/logic/commands/EditPersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-12-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-05-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.CollectionUtil;","lastModifiedDate":"2016-12-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2016-12-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2016-12-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2016-12-26"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2016-12-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":"public class EditPersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" + \"[\" + PREFIX_NUSNET + \"NUSNET] \"","lastModifiedDate":"2024-02-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" + PREFIX_NUSNET + \"e0123456 \"","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" public EditPersonCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2024-02-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":68,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":91,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":99,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" NusNet updatedNusNet \u003d editPersonDescriptor.getNusNet().orElse(personToEdit.getNusNet());","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":109,"author":{"gitId":"ForAeons"},"content":" return new Person(updatedName, updatedPhone, updatedEmail, updatedNusNet, updatedAddress, updatedTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":119,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof EditPersonCommand)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":123,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand otherEditCommand \u003d (EditPersonCommand) other;","lastModifiedDate":"2024-02-26"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":137,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":140,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":141,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":142,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":143,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":144,"author":{"gitId":"ForAeons"},"content":" private NusNet nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":145,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-06-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":148,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":150,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":151,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":152,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":153,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":154,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":155,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":156,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":158,"author":{"gitId":"ForAeons"},"content":" setNusNet(toCopy.nusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":159,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":160,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":163,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":164,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":165,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":167,"author":{"gitId":"ForAeons"},"content":" return CollectionUtil.isAnyNonNull(name, phone, email, nusNet, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":170,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":171,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":174,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":176,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":178,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":179,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":180,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":182,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":183,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":184,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":186,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":187,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":188,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":191,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":194,"author":{"gitId":"ForAeons"},"content":" public void setNusNet(NusNet nusNet) {","lastModifiedDate":"2024-02-25"},{"lineNumber":195,"author":{"gitId":"ForAeons"},"content":" this.nusNet \u003d nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":196,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"ForAeons"},"content":" public Optional\u003cNusNet\u003e getNusNet() {","lastModifiedDate":"2024-02-25"},{"lineNumber":199,"author":{"gitId":"ForAeons"},"content":" return Optional.ofNullable(nusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":200,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":201,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":203,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":206,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":207,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","lastModifiedDate":"2017-06-21"},{"lineNumber":208,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":210,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":211,"author":{"gitId":"-"},"content":" * Sets {@code tags} to this object\u0027s {@code tags}.","lastModifiedDate":"2018-01-11"},{"lineNumber":212,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":213,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":214,"author":{"gitId":"-"},"content":" public void setTags(Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-06-21"},{"lineNumber":215,"author":{"gitId":"-"},"content":" this.tags \u003d (tags !\u003d null) ? new HashSet\u003c\u003e(tags) : null;","lastModifiedDate":"2018-01-11"},{"lineNumber":216,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":218,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":219,"author":{"gitId":"-"},"content":" * Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2018-01-11"},{"lineNumber":220,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":221,"author":{"gitId":"-"},"content":" * Returns {@code Optional#empty()} if {@code tags} is null.","lastModifiedDate":"2018-01-11"},{"lineNumber":222,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":223,"author":{"gitId":"-"},"content":" public Optional\u003cSet\u003cTag\u003e\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":224,"author":{"gitId":"-"},"content":" return (tags !\u003d null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();","lastModifiedDate":"2018-01-11"},{"lineNumber":225,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":227,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":228,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":229,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":230,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":231,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":233,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":234,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":235,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":236,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":238,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":239,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":240,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":241,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":242,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":243,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":244,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":252,"author":{"gitId":"ForAeons"},"content":" .add(\"nusNet\", nusNet)","lastModifiedDate":"2024-02-25"},{"lineNumber":253,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":258,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"-":236,"ForAeons":22}},{"path":"src/main/java/seedu/address/logic/commands/FindPersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Finds and lists all persons in address book whose name contains any of the argument keywords.","lastModifiedDate":"2016-09-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Keyword matching is case insensitive.","lastModifiedDate":"2018-04-01"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-22"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":"public class FindPersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"find\";","lastModifiedDate":"2016-09-22"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Finds all persons whose names contain any of \"","lastModifiedDate":"2016-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"the specified keywords (case-insensitive) and displays them as a list with index numbers.\\n\"","lastModifiedDate":"2018-04-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \"Parameters: KEYWORD [MORE_KEYWORDS]...\\n\"","lastModifiedDate":"2016-09-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" alice bob charlie\";","lastModifiedDate":"2016-09-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final NameContainsKeywordsPredicate predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" public FindPersonCommand(NameContainsKeywordsPredicate predicate) {","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.predicate \u003d predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":32,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(predicate);","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return new CommandResult(","lastModifiedDate":"2018-04-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getFilteredPersonList().size()));","lastModifiedDate":"2018-04-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof FindPersonCommand)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand otherFindCommand \u003d (FindPersonCommand) other;","lastModifiedDate":"2024-02-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return predicate.equals(otherFindCommand.predicate);","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .add(\"predicate\", predicate)","lastModifiedDate":"2019-02-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-22"}],"authorContributionMap":{"-":54,"ForAeons":4}},{"path":"src/main/java/seedu/address/logic/commands/ListPersonCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Lists all persons in the address book to the user.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"public class ListPersonCommand extends Command {","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"list\";","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"Listed all persons\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2019-01-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return new CommandResult(MESSAGE_SUCCESS);","lastModifiedDate":"2016-09-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":23,"ForAeons":1}},{"path":"src/main/java/seedu/address/logic/parser/AddPersonCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-02-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-02-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-02-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-03-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-03-17"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-03-17"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-03-17"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-03-17"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-17"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" * Parses input arguments and creates a new AddPersonCommand object","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"ForAeons"},"content":"public class AddPersonCommandParser implements Parser\u003cAddPersonCommand\u003e {","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" * Parses the given {@code String} of arguments in the context of the AddPersonCommand","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" * and returns an AddPersonCommand object for execution.","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":" public AddPersonCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" PREFIX_EMAIL, PREFIX_NUSNET)","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddPersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"ForAeons"},"content":" PREFIX_NUSNET, PREFIX_ADDRESS);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" NusNet nusNet \u003d ParserUtil.parseNusNet(argMultimap.getValue(PREFIX_NUSNET).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagList \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2017-03-17"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" Person person \u003d new Person(name, phone, email, nusNet, address, tagList);","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" return new AddPersonCommand(person);","lastModifiedDate":"2024-02-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":62,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":63,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":67,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"-":49,"ForAeons":18}},{"path":"src/main/java/seedu/address/logic/parser/AddressBookParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.LogsCenter;","lastModifiedDate":"2023-07-29"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ClearCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.Command;","lastModifiedDate":"2017-01-18"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.DeletePersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ExitCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.FindPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.HelpCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.ListPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses user input.","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class AddressBookParser {","lastModifiedDate":"2017-07-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Used for initial separation of command word and args.","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Pattern BASIC_COMMAND_FORMAT \u003d Pattern.compile(\"(?\u003ccommandWord\u003e\\\\S+)(?\u003carguments\u003e.*)\");","lastModifiedDate":"2016-09-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AddressBookParser.class);","lastModifiedDate":"2023-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Parses user input into command for execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * @param userInput full user input string","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @return the command based on the user input","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" final Matcher matcher \u003d BASIC_COMMAND_FORMAT.matcher(userInput.trim());","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (!matcher.matches()) {","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Note to developers: Change the log level in config.json to enable lower level (i.e., FINE, FINER and lower)","lastModifiedDate":"2023-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // log messages such as the one below.","lastModifiedDate":"2023-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // Lower level log messages are used sparingly to minimize noise in the code.","lastModifiedDate":"2023-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" logger.fine(\"Command word: \" + commandWord + \"; Arguments: \" + arguments);","lastModifiedDate":"2023-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" switch (commandWord) {","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" case AddPersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" return new AddPersonCommandParser().parse(arguments);","lastModifiedDate":"2024-02-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" case EditPersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":" return new EditPersonCommandParser().parse(arguments);","lastModifiedDate":"2024-02-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" case DeletePersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":63,"author":{"gitId":"ForAeons"},"content":" return new DeletePersonCommandParser().parse(arguments);","lastModifiedDate":"2024-02-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" case ClearCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new ClearCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" case FindPersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":69,"author":{"gitId":"ForAeons"},"content":" return new FindPersonCommandParser().parse(arguments);","lastModifiedDate":"2024-02-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" case ListPersonCommand.COMMAND_WORD:","lastModifiedDate":"2024-02-26"},{"lineNumber":72,"author":{"gitId":"ForAeons"},"content":" return new ListPersonCommand();","lastModifiedDate":"2024-02-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" case ExitCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new ExitCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" case HelpCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return new HelpCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" default:","lastModifiedDate":"2016-08-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" logger.finer(\"This user input caused a ParseException: \" + userInput);","lastModifiedDate":"2023-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-03-11"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":71,"ForAeons":15}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":" public static final Prefix PREFIX_NUSNET \u003d new Prefix(\"nn/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":15,"ForAeons":1}},{"path":"src/main/java/seedu/address/logic/parser/DeletePersonCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":6,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.DeletePersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":10,"author":{"gitId":"ForAeons"},"content":" * Parses input arguments and creates a new DeletePersonCommand object","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":"public class DeletePersonCommandParser implements Parser\u003cDeletePersonCommand\u003e {","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":15,"author":{"gitId":"ForAeons"},"content":" * Parses the given {@code String} of arguments in the context of the DeletePersonCommand","lastModifiedDate":"2024-02-26"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":" * and returns a DeletePersonCommand object for execution.","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":" public DeletePersonCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2017-05-25"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":" return new DeletePersonCommand(index);","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeletePersonCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":21,"ForAeons":8}},{"path":"src/main/java/seedu/address/logic/parser/EditPersonCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-01-26"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"ForAeons"},"content":" * Parses input arguments and creates a new EditPersonCommand object","lastModifiedDate":"2024-02-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":"public class EditPersonCommandParser implements Parser\u003cEditPersonCommand\u003e {","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":" * Parses the given {@code String} of arguments in the context of the EditPersonCommand","lastModifiedDate":"2024-02-26"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" * and returns an EditPersonCommand object for execution.","lastModifiedDate":"2024-02-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" public EditPersonCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_NAME).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"-"},"content":" editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":62,"author":{"gitId":"-"},"content":" parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2017-06-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":65,"author":{"gitId":"ForAeons"},"content":" throw new ParseException(EditPersonCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2024-02-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" return new EditPersonCommand(index, editPersonDescriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2017-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2017-01-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2017-03-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" private Optional\u003cSet\u003cTag\u003e\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2017-01-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2017-01-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":75,"ForAeons":11}},{"path":"src/main/java/seedu/address/logic/parser/FindPersonCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.FindPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":" * Parses input arguments and creates a new FindPersonCommand object","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":"public class FindPersonCommandParser implements Parser\u003cFindPersonCommand\u003e {","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":" * Parses the given {@code String} of arguments in the context of the FindPersonCommand","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":" * and returns a FindPersonCommand object for execution.","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":21,"author":{"gitId":"ForAeons"},"content":" public FindPersonCommand parse(String args) throws ParseException {","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" String trimmedArgs \u003d args.trim();","lastModifiedDate":"2017-02-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" if (trimmedArgs.isEmpty()) {","lastModifiedDate":"2017-02-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ParseException(","lastModifiedDate":"2017-03-11"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindPersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" String[] nameKeywords \u003d trimmedArgs.split(\"\\\\s+\");","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" return new FindPersonCommand(new NameContainsKeywordsPredicate(Arrays.asList(nameKeywords)));","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":25,"ForAeons":8}},{"path":"src/main/java/seedu/address/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-02-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-02-11"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":32,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":34,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":49,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":57,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":61,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":62,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":64,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":72,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":74,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":76,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":77,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":79,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":84,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":89,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":90,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":93,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"ForAeons"},"content":" * Parses a {@code String nusNet} into a {@code NusNet}.","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"ForAeons"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" * @throws ParseException if the given {@code nusNet} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" public static NusNet parseNusNet(String nusNet) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" requireNonNull(nusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" String trimmedNusNet \u003d nusNet.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":" if (!NusNet.isValidNusNet(trimmedNusNet)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"ForAeons"},"content":" throw new ParseException(NusNet.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"ForAeons"},"content":" return new NusNet(trimmedNusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":119,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":121,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":123,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":129,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":131,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":133,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":134,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":135,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":136,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":138,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":140,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":124,"ForAeons":16}},{"path":"src/main/java/seedu/address/model/person/NusNet.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"ForAeons"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"ForAeons"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-24"},{"lineNumber":4,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-24"},{"lineNumber":5,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":6,"author":{"gitId":"ForAeons"},"content":"/**","lastModifiedDate":"2024-02-24"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":" * Represents a Person\u0027s NUSNET in the address book.","lastModifiedDate":"2024-02-24"},{"lineNumber":8,"author":{"gitId":"ForAeons"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidNusNet(String)}","lastModifiedDate":"2024-02-24"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-24"},{"lineNumber":10,"author":{"gitId":"ForAeons"},"content":"public class NusNet {","lastModifiedDate":"2024-02-24"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"NUSNET should be of the format E\"","lastModifiedDate":"2024-02-24"},{"lineNumber":13,"author":{"gitId":"ForAeons"},"content":" + \"followed by 7 digits\";","lastModifiedDate":"2024-02-24"},{"lineNumber":14,"author":{"gitId":"ForAeons"},"content":" public static final String VALIDATION_REGEX \u003d \"^[Ee]\\\\d{7}$\";","lastModifiedDate":"2024-02-24"},{"lineNumber":15,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":" public final String value;","lastModifiedDate":"2024-02-24"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-24"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":" * Constructs an {@code NusNet}.","lastModifiedDate":"2024-02-24"},{"lineNumber":20,"author":{"gitId":"ForAeons"},"content":" *","lastModifiedDate":"2024-02-24"},{"lineNumber":21,"author":{"gitId":"ForAeons"},"content":" * @param nusnet A valid nusnet id.","lastModifiedDate":"2024-02-24"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-24"},{"lineNumber":23,"author":{"gitId":"ForAeons"},"content":" public NusNet(String nusnet) {","lastModifiedDate":"2024-02-24"},{"lineNumber":24,"author":{"gitId":"ForAeons"},"content":" requireNonNull(nusnet);","lastModifiedDate":"2024-02-24"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" checkArgument(isValidNusNet(nusnet), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-24"},{"lineNumber":26,"author":{"gitId":"ForAeons"},"content":" value \u003d nusnet;","lastModifiedDate":"2024-02-24"},{"lineNumber":27,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-24"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" * Returns if a given string is a valid nusnet id.","lastModifiedDate":"2024-02-24"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-24"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" public static boolean isValidNusNet(String test) {","lastModifiedDate":"2024-02-24"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-02-24"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":35,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" @Override","lastModifiedDate":"2024-02-24"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" public String toString() {","lastModifiedDate":"2024-02-24"},{"lineNumber":38,"author":{"gitId":"ForAeons"},"content":" return value;","lastModifiedDate":"2024-02-24"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":41,"author":{"gitId":"ForAeons"},"content":" @Override","lastModifiedDate":"2024-02-24"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-24"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-24"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" return true;","lastModifiedDate":"2024-02-24"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":46,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-24"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" if (!(other instanceof NusNet)) {","lastModifiedDate":"2024-02-24"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" return false;","lastModifiedDate":"2024-02-24"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":51,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" NusNet otherNusNet \u003d (NusNet) other;","lastModifiedDate":"2024-02-24"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" return this.value.equalsIgnoreCase(otherNusNet.value); // case insensitive","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" @Override","lastModifiedDate":"2024-02-24"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" public int hashCode() {","lastModifiedDate":"2024-02-24"},{"lineNumber":58,"author":{"gitId":"ForAeons"},"content":" return value.hashCode();","lastModifiedDate":"2024-02-24"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-24"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":"}","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"ForAeons":61}},{"path":"src/main/java/seedu/address/model/person/Person.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 seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2017-05-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"ForAeons"},"content":" private final NusNet nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" public Person(Name name, Phone phone, Email email, NusNet nusNet, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" requireAllNonNull(name, phone, email, address, tags);","lastModifiedDate":"2017-05-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" this.nusNet \u003d nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" public NusNet getNusNet() {","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" return nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" * Returns true if both persons have the same nusnet id.","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"ForAeons"},"content":" if (otherPerson \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"ForAeons"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"ForAeons"},"content":" // NUSNET is used as the unique identifier for a person","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"ForAeons"},"content":" return otherPerson.getNusNet().equals(this.getNusNet());","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":94,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":95,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":98,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":100,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":105,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" \u0026\u0026 nusNet.equals(otherPerson.nusNet)","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":115,"author":{"gitId":"ForAeons"},"content":" return Objects.hash(name, phone, email, nusNet, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":124,"author":{"gitId":"ForAeons"},"content":" .add(\"nusNet\", nusNet)","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":130,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":112,"ForAeons":18}},{"path":"src/main/java/seedu/address/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.util;","lastModifiedDate":"2016-12-20"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2016-12-20"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2016-12-20"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2016-12-20"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-20"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2016-12-20"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-14"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" new Person(new Name(\"Alex Yeoh\"), new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"E1234567\"), new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Person(new Name(\"Bernice Yu\"), new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":27,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"e2345678\"), new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"E3456789\"), new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" new Person(new Name(\"David Li\"), new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"e0000001\"), new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"E0000002\"), new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" new NusNet(\"e0000003\"), new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":41,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"-":54,"ForAeons":7}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" private final String nusNet;","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"nusNet\") String nusNet,","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"ForAeons"},"content":" @JsonProperty(\"address\") String address, @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags) {","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" this.nusNet \u003d nusNet;","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" nusNet \u003d source.getNusNet().value;","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"ForAeons"},"content":" if (nusNet \u003d\u003d null) {","lastModifiedDate":"2024-02-26"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, NusNet.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":" if (!NusNet.isValidNusNet(nusNet)) {","lastModifiedDate":"2024-02-26"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" throw new IllegalValueException(NusNet.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" final NusNet modelNusNet \u003d new NusNet(nusNet);","lastModifiedDate":"2024-02-26"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"ForAeons"},"content":" return new Person(modelName, modelPhone, modelEmail, modelNusNet, modelAddress, modelTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":106,"ForAeons":15}},{"path":"src/main/java/seedu/address/ui/PersonCard.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.ui;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Comparator;","lastModifiedDate":"2019-01-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-01-02"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-09-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2016-09-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.scene.layout.FlowPane;","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.scene.layout.HBox;","lastModifiedDate":"2016-09-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import javafx.scene.layout.Region;","lastModifiedDate":"2016-12-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * An UI component that displays information of a {@code Person}.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class PersonCard extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListCard.fxml\";","lastModifiedDate":"2016-09-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Note: Certain keywords such as \"location\" and \"resources\" are reserved keywords in JavaFX.","lastModifiedDate":"2017-03-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * As a consequence, UI elements\u0027 variable names cannot be set to such keywords","lastModifiedDate":"2017-03-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * or an exception will be thrown by JavaFX during runtime.","lastModifiedDate":"2017-03-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * @see \u003ca href\u003d\"https://github.com/se-edu/addressbook-level4/issues/336\"\u003eThe issue on AddressBook level 4\u003c/a\u003e","lastModifiedDate":"2017-03-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public final Person person;","lastModifiedDate":"2018-01-10"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private HBox cardPane;","lastModifiedDate":"2016-09-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private Label name;","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private Label id;","lastModifiedDate":"2016-09-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Label phone;","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Label address;","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Label email;","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" private Label nusNet;","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":" @FXML","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private FlowPane tags;","lastModifiedDate":"2016-12-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Creates a {@code PersonCode} with the given {@code Person} and index to display.","lastModifiedDate":"2020-05-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2018-01-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2017-07-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" id.setText(displayedIndex + \". \");","lastModifiedDate":"2016-09-21"},{"lineNumber":53,"author":{"gitId":"-"},"content":" name.setText(person.getName().fullName);","lastModifiedDate":"2017-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" phone.setText(person.getPhone().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" address.setText(person.getAddress().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" email.setText(person.getEmail().value);","lastModifiedDate":"2017-12-20"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" nusNet.setText(person.getNusNet().value);","lastModifiedDate":"2024-02-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" person.getTags().stream()","lastModifiedDate":"2019-01-02"},{"lineNumber":59,"author":{"gitId":"-"},"content":" .sorted(Comparator.comparing(tag -\u003e tag.tagName))","lastModifiedDate":"2019-01-02"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .forEach(tag -\u003e tags.getChildren().add(new Label(tag.tagName)));","lastModifiedDate":"2019-01-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":62,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"-":59,"ForAeons":3}},{"path":"src/main/resources/view/PersonListCard.fxml","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.FlowPane?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.Region?\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cHBox id\u003d\"cardPane\" fx:id\u003d\"cardPane\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2023-07-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cGridPane HBox.hgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" prefWidth\u003d\"150\" /\u003e","lastModifiedDate":"2017-03-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cVBox alignment\u003d\"CENTER_LEFT\" minHeight\u003d\"105\" GridPane.columnIndex\u003d\"0\"\u003e","lastModifiedDate":"2017-03-28"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cpadding\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"5\" bottom\u003d\"5\" left\u003d\"15\" /\u003e","lastModifiedDate":"2017-03-27"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003c/padding\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cHBox spacing\u003d\"5\" alignment\u003d\"CENTER_LEFT\"\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"id\" styleClass\u003d\"cell_big_label\"\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cminWidth\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003c!-- Ensures that the label text is never truncated --\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cRegion fx:constant\u003d\"USE_PREF_SIZE\" /\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/minWidth\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/Label\u003e","lastModifiedDate":"2017-03-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"name\" text\u003d\"\\$first\" styleClass\u003d\"cell_big_label\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2016-09-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cFlowPane fx:id\u003d\"tags\" /\u003e","lastModifiedDate":"2016-12-18"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":" \u003cLabel fx:id\u003d\"nusNet\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$nusNet\" /\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/GridPane\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"\u003c/HBox\u003e","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"-":36,"ForAeons":1}},{"path":"src/test/java/seedu/address/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2016-09-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NUSNET_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.CommandResult;","lastModifiedDate":"2017-01-18"},{"lineNumber":24,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.ListPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2016-09-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2016-09-21"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-31"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonAddressBookStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonUserPrefsStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import seedu.address.storage.StorageManager;","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-12-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":64,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":70,"author":{"gitId":"ForAeons"},"content":" String listCommand \u003d ListPersonCommand.COMMAND_WORD;","lastModifiedDate":"2024-02-26"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" assertCommandSuccess(listCommand, ListPersonCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2024-02-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":123,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":125,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":131,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":137,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":138,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":149,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":150,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":155,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":160,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":166,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":168,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"ForAeons"},"content":" String addCommand \u003d AddPersonCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY","lastModifiedDate":"2024-02-26"},{"lineNumber":170,"author":{"gitId":"ForAeons"},"content":" + EMAIL_DESC_AMY + NUSNET_DESC_AMY + ADDRESS_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":171,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":173,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":174,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":176,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"-":169,"ForAeons":7}},{"path":"src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2017-07-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2017-07-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-15"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-06-15"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-06-15"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-15"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code AddCommand}.","lastModifiedDate":"2017-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class AddCommandIntegrationTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_newPerson_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" expectedModel.addPerson(validPerson);","lastModifiedDate":"2017-06-15"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" assertCommandSuccess(new AddPersonCommand(validPerson), model,","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" String.format(AddPersonCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" expectedModel);","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(0);","lastModifiedDate":"2018-01-10"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" assertCommandFailure(new AddPersonCommand(personInList), model,","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"-":44,"ForAeons":4}},{"path":"src/test/java/seedu/address/logic/commands/AddCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-01-10"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-05-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2017-09-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2018-11-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-05-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-05-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-05-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2017-05-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyUserPrefs;","lastModifiedDate":"2018-11-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-05-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-05-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class AddCommandTest {","lastModifiedDate":"2017-05-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void constructor_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" assertThrows(NullPointerException.class, () -\u003e new AddPersonCommand(null));","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void execute_personAcceptedByModel_addSuccessful() throws Exception {","lastModifiedDate":"2017-05-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" ModelStubAcceptingPersonAdded modelStub \u003d new ModelStubAcceptingPersonAdded();","lastModifiedDate":"2017-05-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" CommandResult commandResult \u003d new AddPersonCommand(validPerson).execute(modelStub);","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" assertEquals(String.format(AddPersonCommand.MESSAGE_SUCCESS, Messages.format(validPerson)),","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" commandResult.getFeedbackToUser());","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertEquals(Arrays.asList(validPerson), modelStub.personsAdded);","lastModifiedDate":"2017-05-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public void execute_duplicatePerson_throwsCommandException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" Person validPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-12"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addCommand \u003d new AddPersonCommand(validPerson);","lastModifiedDate":"2024-02-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" ModelStub modelStub \u003d new ModelStubWithPerson(validPerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" assertThrows(CommandException.class,","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand.MESSAGE_DUPLICATE_PERSON, () -\u003e addCommand.execute(modelStub));","lastModifiedDate":"2024-02-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Person alice \u003d new PersonBuilder().withName(\"Alice\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Person bob \u003d new PersonBuilder().withName(\"Bob\").build();","lastModifiedDate":"2017-06-22"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addAliceCommand \u003d new AddPersonCommand(alice);","lastModifiedDate":"2024-02-26"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addBobCommand \u003d new AddPersonCommand(bob);","lastModifiedDate":"2024-02-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":64,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addAliceCommandCopy \u003d new AddPersonCommand(alice);","lastModifiedDate":"2024-02-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertTrue(addAliceCommand.equals(addAliceCommandCopy));","lastModifiedDate":"2017-06-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(1));","lastModifiedDate":"2017-06-22"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(null));","lastModifiedDate":"2017-06-22"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-22"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(addAliceCommand.equals(addBobCommand));","lastModifiedDate":"2017-06-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand addCommand \u003d new AddPersonCommand(ALICE);","lastModifiedDate":"2024-02-26"},{"lineNumber":84,"author":{"gitId":"ForAeons"},"content":" String expected \u003d AddPersonCommand.class.getCanonicalName() + \"{toAdd\u003d\" + ALICE + \"}\";","lastModifiedDate":"2024-02-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertEquals(expected, addCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * A default model stub that have all of the methods failing.","lastModifiedDate":"2017-05-12"},{"lineNumber":90,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private class ModelStub implements Model {","lastModifiedDate":"2017-05-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void setUserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":94,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public ReadOnlyUserPrefs getUserPrefs() {","lastModifiedDate":"2018-11-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":104,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":109,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":114,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-11-27"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-11-27"},{"lineNumber":119,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-11-27"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":124,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void setAddressBook(ReadOnlyAddressBook newData) {","lastModifiedDate":"2018-11-27"},{"lineNumber":129,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":137,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-06"},{"lineNumber":139,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":142,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":143,"author":{"gitId":"-"},"content":" public void deletePerson(Person target) {","lastModifiedDate":"2018-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":147,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":148,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-17"},{"lineNumber":149,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":152,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":153,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e getFilteredPersonList() {","lastModifiedDate":"2018-01-10"},{"lineNumber":154,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":157,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":158,"author":{"gitId":"-"},"content":" public void updateFilteredPersonList(Predicate\u003cPerson\u003e predicate) {","lastModifiedDate":"2018-01-10"},{"lineNumber":159,"author":{"gitId":"-"},"content":" throw new AssertionError(\"This method should not be called.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":160,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":163,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":164,"author":{"gitId":"-"},"content":" * A Model stub that contains a single person.","lastModifiedDate":"2018-08-07"},{"lineNumber":165,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":166,"author":{"gitId":"-"},"content":" private class ModelStubWithPerson extends ModelStub {","lastModifiedDate":"2018-08-07"},{"lineNumber":167,"author":{"gitId":"-"},"content":" private final Person person;","lastModifiedDate":"2018-08-07"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":169,"author":{"gitId":"-"},"content":" ModelStubWithPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":170,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":171,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2018-08-07"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":175,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":176,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":177,"author":{"gitId":"-"},"content":" return this.person.isSamePerson(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":181,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":" * A Model stub that always accept the person being added.","lastModifiedDate":"2017-05-12"},{"lineNumber":183,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-12"},{"lineNumber":184,"author":{"gitId":"-"},"content":" private class ModelStubAcceptingPersonAdded extends ModelStub {","lastModifiedDate":"2017-05-12"},{"lineNumber":185,"author":{"gitId":"-"},"content":" final ArrayList\u003cPerson\u003e personsAdded \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2017-05-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":187,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-07"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public boolean hasPerson(Person person) {","lastModifiedDate":"2018-08-07"},{"lineNumber":189,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-08-07"},{"lineNumber":190,"author":{"gitId":"-"},"content":" return personsAdded.stream().anyMatch(person::isSamePerson);","lastModifiedDate":"2018-08-07"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":193,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-12"},{"lineNumber":194,"author":{"gitId":"-"},"content":" public void addPerson(Person person) {","lastModifiedDate":"2018-08-08"},{"lineNumber":195,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":196,"author":{"gitId":"-"},"content":" personsAdded.add(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":197,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":" public ReadOnlyAddressBook getAddressBook() {","lastModifiedDate":"2017-05-04"},{"lineNumber":201,"author":{"gitId":"-"},"content":" return new AddressBook();","lastModifiedDate":"2017-05-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-12"},{"lineNumber":205,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-12"}],"authorContributionMap":{"-":194,"ForAeons":11}},{"path":"src/test/java/seedu/address/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" public static final String VALID_NUSNET_AMY \u003d \"e1111111\";","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" public static final String VALID_NUSNET_BOB \u003d \"e2222222\";","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" public static final String NUSNET_DESC_AMY \u003d \" \" + PREFIX_NUSNET + VALID_NUSNET_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" public static final String NUSNET_DESC_BOB \u003d \" \" + PREFIX_NUSNET + VALID_NUSNET_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public static final String INVALID_NAME_DESC \u003d \" \" + PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2017-07-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \" + PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2017-07-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \" + PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-07-05"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" public static final String INVALID_NUSNET_DESC \u003d \" \" + PREFIX_NUSNET + \"e1111111a\"; // \u0027a\u0027 not allowed in nusnet","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \" + PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2017-07-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final String INVALID_TAG_DESC \u003d \" \" + PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2017-07-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" public static final EditPersonCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2024-02-26"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" public static final EditPersonCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2024-02-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":85,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":89,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":111,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":114,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":129,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"-":126,"ForAeons":8}},{"path":"src/test/java/seedu/address/logic/commands/DeleteCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2018-01-31"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for","lastModifiedDate":"2020-12-16"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * {@code DeleteCommand}.","lastModifiedDate":"2018-01-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class DeleteCommandTest {","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void execute_validIndexUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(DeletePersonCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void execute_invalidIndexUnfilteredList_throwsCommandException() {","lastModifiedDate":"2018-08-08"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-06-05"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(outOfBoundIndex);","lastModifiedDate":"2024-02-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_validIndexFilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Person personToDelete \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(DeletePersonCommand.MESSAGE_DELETE_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Messages.format(personToDelete));","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" expectedModel.deletePerson(personToDelete);","lastModifiedDate":"2017-06-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" showNoPerson(expectedModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void execute_invalidIndexFilteredList_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-06-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-06-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-06-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":77,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(outOfBoundIndex);","lastModifiedDate":"2024-02-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":84,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteFirstCommand \u003d new DeletePersonCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":85,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteSecondCommand \u003d new DeletePersonCommand(INDEX_SECOND_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteFirstCommandCopy \u003d new DeletePersonCommand(INDEX_FIRST_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" assertTrue(deleteFirstCommand.equals(deleteFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":94,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertFalse(deleteFirstCommand.equals(deleteSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Index targetIndex \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand deleteCommand \u003d new DeletePersonCommand(targetIndex);","lastModifiedDate":"2024-02-26"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":" String expected \u003d DeletePersonCommand.class.getCanonicalName() + \"{targetIndex\u003d\" + targetIndex + \"}\";","lastModifiedDate":"2024-02-26"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(expected, deleteCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show no one.","lastModifiedDate":"2017-06-05"},{"lineNumber":114,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":115,"author":{"gitId":"-"},"content":" private void showNoPerson(Model model) {","lastModifiedDate":"2017-06-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(p -\u003e false);","lastModifiedDate":"2017-06-12"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertTrue(model.getFilteredPersonList().isEmpty());","lastModifiedDate":"2018-02-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"-":109,"ForAeons":11}},{"path":"src/test/java/seedu/address/logic/commands/EditCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2018-01-31"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-05-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-05-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-05-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for EditCommand.","lastModifiedDate":"2020-12-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"public class EditCommandTest {","lastModifiedDate":"2017-05-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void execute_allFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder().build();","lastModifiedDate":"2017-05-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(editedPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" Messages.format(editedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-06-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void execute_someFieldsSpecifiedUnfilteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Index indexLastPerson \u003d Index.fromOneBased(model.getFilteredPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Person lastPerson \u003d model.getFilteredPersonList().get(indexLastPerson.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":58,"author":{"gitId":"-"},"content":" PersonBuilder personInList \u003d new PersonBuilder(lastPerson);","lastModifiedDate":"2017-05-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":" Person editedPerson \u003d personInList.withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-05-18"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":64,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(indexLastPerson, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" Messages.format(editedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":70,"author":{"gitId":"-"},"content":" expectedModel.setPerson(lastPerson, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void execute_noFieldSpecifiedUnfilteredList_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":77,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON, new EditPersonDescriptor());","lastModifiedDate":"2024-02-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Person editedPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":80,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" Messages.format(editedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public void execute_filteredList_success() {","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":92,"author":{"gitId":"-"},"content":" Person personInFilteredList \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new PersonBuilder(personInFilteredList).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-18"},{"lineNumber":94,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2024-02-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":97,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(EditPersonCommand.MESSAGE_EDIT_PERSON_SUCCESS,","lastModifiedDate":"2024-02-26"},{"lineNumber":98,"author":{"gitId":"ForAeons"},"content":" Messages.format(editedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":100,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());","lastModifiedDate":"2017-05-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":" expectedModel.setPerson(model.getFilteredPersonList().get(0), editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":103,"author":{"gitId":"-"},"content":" assertCommandSuccess(editCommand, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Person firstPerson \u003d model.getFilteredPersonList().get(INDEX_FIRST_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":109,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(firstPerson).build();","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_SECOND_PERSON, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"ForAeons"},"content":" assertCommandFailure(editCommand, model, EditPersonCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":115,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public void execute_duplicatePersonFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":117,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // edit person in filtered list into a duplicate in address book","lastModifiedDate":"2017-05-18"},{"lineNumber":120,"author":{"gitId":"-"},"content":" Person personInList \u003d model.getAddressBook().getPersonList().get(INDEX_SECOND_PERSON.getZeroBased());","lastModifiedDate":"2018-01-10"},{"lineNumber":121,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON,","lastModifiedDate":"2024-02-26"},{"lineNumber":122,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder(personInList).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":124,"author":{"gitId":"ForAeons"},"content":" assertCommandFailure(editCommand, model, EditPersonCommand.MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2024-02-26"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexUnfilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":129,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d Index.fromOneBased(model.getFilteredPersonList().size() + 1);","lastModifiedDate":"2017-05-18"},{"lineNumber":130,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-22"},{"lineNumber":131,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(outOfBoundIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":136,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-18"},{"lineNumber":137,"author":{"gitId":"-"},"content":" * Edit filtered list where index is larger than size of filtered list,","lastModifiedDate":"2017-05-18"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * but smaller than size of address book","lastModifiedDate":"2017-05-18"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-18"},{"lineNumber":140,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-18"},{"lineNumber":141,"author":{"gitId":"-"},"content":" public void execute_invalidPersonIndexFilteredList_failure() {","lastModifiedDate":"2017-08-15"},{"lineNumber":142,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":" Index outOfBoundIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-18"},{"lineNumber":144,"author":{"gitId":"-"},"content":" // ensures that outOfBoundIndex is still in bounds of address book list","lastModifiedDate":"2017-05-18"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertTrue(outOfBoundIndex.getZeroBased() \u003c model.getAddressBook().getPersonList().size());","lastModifiedDate":"2017-05-18"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":147,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(outOfBoundIndex,","lastModifiedDate":"2024-02-26"},{"lineNumber":148,"author":{"gitId":"-"},"content":" new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build());","lastModifiedDate":"2017-05-18"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":150,"author":{"gitId":"-"},"content":" assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2019-01-25"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-18"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-18"},{"lineNumber":153,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-01-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-08-08"},{"lineNumber":155,"author":{"gitId":"ForAeons"},"content":" final EditPersonCommand standardCommand \u003d new EditPersonCommand(INDEX_FIRST_PERSON, DESC_AMY);","lastModifiedDate":"2024-02-26"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":157,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":158,"author":{"gitId":"-"},"content":" EditPersonDescriptor copyDescriptor \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-08"},{"lineNumber":159,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand commandWithSameValues \u003d new EditPersonCommand(INDEX_FIRST_PERSON, copyDescriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":160,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(commandWithSameValues));","lastModifiedDate":"2017-05-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":162,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertTrue(standardCommand.equals(standardCommand));","lastModifiedDate":"2017-05-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":166,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(null));","lastModifiedDate":"2017-05-08"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":168,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":169,"author":{"gitId":"-"},"content":" assertFalse(standardCommand.equals(new ClearCommand()));","lastModifiedDate":"2017-05-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":171,"author":{"gitId":"-"},"content":" // different index -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":172,"author":{"gitId":"ForAeons"},"content":" assertFalse(standardCommand.equals(new EditPersonCommand(INDEX_SECOND_PERSON, DESC_AMY)));","lastModifiedDate":"2024-02-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // different descriptor -\u003e returns false","lastModifiedDate":"2017-05-08"},{"lineNumber":175,"author":{"gitId":"ForAeons"},"content":" assertFalse(standardCommand.equals(new EditPersonCommand(INDEX_FIRST_PERSON, DESC_BOB)));","lastModifiedDate":"2024-02-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" Index index \u003d Index.fromOneBased(1);","lastModifiedDate":"2019-02-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":182,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand editCommand \u003d new EditPersonCommand(index, editPersonDescriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":183,"author":{"gitId":"ForAeons"},"content":" String expected \u003d EditPersonCommand.class.getCanonicalName() + \"{index\u003d\" + index + \", editPersonDescriptor\u003d\"","lastModifiedDate":"2024-02-26"},{"lineNumber":184,"author":{"gitId":"-"},"content":" + editPersonDescriptor + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":" assertEquals(expected, editCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-08"}],"authorContributionMap":{"-":163,"ForAeons":25}},{"path":"src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptorWithSameValues \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(DESC_AMY));","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(null));","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(5));","lastModifiedDate":"2017-05-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(DESC_BOB));","lastModifiedDate":"2017-05-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String expected \u003d EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getName().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" + editPersonDescriptor.getNusNet().orElse(null) + \", nusNet\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", address\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getAddress().orElse(null) + \", tags\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getTags().orElse(null) + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":70,"ForAeons":2}},{"path":"src/test/java/seedu/address/logic/commands/FindCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_PERSONS_LISTED_OVERVIEW;","lastModifiedDate":"2023-07-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2018-08-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.CARL;","lastModifiedDate":"2017-07-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ELLE;","lastModifiedDate":"2017-07-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.FIONA;","lastModifiedDate":"2017-07-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) for {@code FindCommand}.","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class FindCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Model expectedModel \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2018-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-06-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate firstPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"first\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate secondPredicate \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new NameContainsKeywordsPredicate(Collections.singletonList(\"second\"));","lastModifiedDate":"2017-06-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand findFirstCommand \u003d new FindPersonCommand(firstPredicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand findSecondCommand \u003d new FindPersonCommand(secondPredicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand findFirstCommandCopy \u003d new FindPersonCommand(firstPredicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(findFirstCommand.equals(findFirstCommandCopy));","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(1));","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(null));","lastModifiedDate":"2017-06-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2017-06-27"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertFalse(findFirstCommand.equals(findSecondCommand));","lastModifiedDate":"2017-06-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void execute_zeroKeywords_noPersonFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":59,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 0);","lastModifiedDate":"2017-06-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\" \");","lastModifiedDate":"2018-08-08"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand command \u003d new FindPersonCommand(predicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertEquals(Collections.emptyList(), model.getFilteredPersonList());","lastModifiedDate":"2018-08-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void execute_multipleKeywords_multiplePersonsFound() {","lastModifiedDate":"2017-08-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 3);","lastModifiedDate":"2017-06-12"},{"lineNumber":70,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d preparePredicate(\"Kurz Elle Kunz\");","lastModifiedDate":"2018-08-08"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand command \u003d new FindPersonCommand(predicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" expectedModel.updateFilteredPersonList(predicate);","lastModifiedDate":"2018-08-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, model, expectedMessage, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertEquals(Arrays.asList(CARL, ELLE, FIONA), model.getFilteredPersonList());","lastModifiedDate":"2018-08-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate predicate \u003d new NameContainsKeywordsPredicate(Arrays.asList(\"keyword\"));","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand findCommand \u003d new FindPersonCommand(predicate);","lastModifiedDate":"2024-02-26"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" String expected \u003d FindPersonCommand.class.getCanonicalName() + \"{predicate\u003d\" + predicate + \"}\";","lastModifiedDate":"2024-02-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertEquals(expected, findCommand.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-12"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Parses {@code userInput} into a {@code NameContainsKeywordsPredicate}.","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private NameContainsKeywordsPredicate preparePredicate(String userInput) {","lastModifiedDate":"2018-08-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return new NameContainsKeywordsPredicate(Arrays.asList(userInput.split(\"\\\\s+\")));","lastModifiedDate":"2018-08-08"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"-":84,"ForAeons":7}},{"path":"src/test/java/seedu/address/logic/commands/ListCommandTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;","lastModifiedDate":"2017-07-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex;","lastModifiedDate":"2018-01-31"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2018-01-31"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2017-07-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Contains integration tests (interaction with the Model) and unit tests for ListCommand.","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class ListCommandTest {","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private Model model;","lastModifiedDate":"2017-06-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private Model expectedModel;","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" model \u003d new ModelManager(getTypicalAddressBook(), new UserPrefs());","lastModifiedDate":"2017-07-19"},{"lineNumber":26,"author":{"gitId":"-"},"content":" expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public void execute_listIsNotFiltered_showsSameList() {","lastModifiedDate":"2017-08-15"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" assertCommandSuccess(new ListPersonCommand(), model, ListPersonCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void execute_listIsFiltered_showsEverything() {","lastModifiedDate":"2017-08-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" showPersonAtIndex(model, INDEX_FIRST_PERSON);","lastModifiedDate":"2018-01-31"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" assertCommandSuccess(new ListPersonCommand(), model, ListPersonCommand.MESSAGE_SUCCESS, expectedModel);","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"-":37,"ForAeons":2}},{"path":"src/test/java/seedu/address/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NUSNET_DESC;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NUSNET_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NUSNET_DESC_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2017-12-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2017-12-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-07-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-06-15"},{"lineNumber":45,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-06-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":49,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-06-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-06-15"},{"lineNumber":51,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":53,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" private AddPersonCommandParser parser \u003d new AddPersonCommandParser();","lastModifiedDate":"2024-02-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2018-07-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" + NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"ForAeons"},"content":" + PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"ForAeons"},"content":" + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" + TAG_DESC_FRIEND, new AddPersonCommand(expectedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":70,"author":{"gitId":"-"},"content":" // multiple tags - all accepted","lastModifiedDate":"2017-06-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)","lastModifiedDate":"2018-07-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"ForAeons"},"content":" NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + NUSNET_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"ForAeons"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"ForAeons"},"content":" new AddPersonCommand(expectedPersonMultipleTags));","lastModifiedDate":"2024-02-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + NUSNET_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND;","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":86,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertParseFailure(parser, ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_AMY + NAME_DESC_AMY + ADDRESS_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"-"},"content":" + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS,","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" PREFIX_NUSNET, PREFIX_PHONE, PREFIX_EMAIL));","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":110,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":112,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":" // valid value followed by invalid value","lastModifiedDate":"2023-07-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":128,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NAME_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":130,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_EMAIL_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":136,"author":{"gitId":"ForAeons"},"content":" // invalid nusnet","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_NUSNET_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":138,"author":{"gitId":"ForAeons"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NUSNET));","lastModifiedDate":"2024-02-25"},{"lineNumber":139,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":140,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":141,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_PHONE_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":142,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":144,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertParseFailure(parser, validExpectedPersonString + INVALID_ADDRESS_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":146,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":153,"author":{"gitId":"ForAeons"},"content":" assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":154,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_AMY + ADDRESS_DESC_AMY,","lastModifiedDate":"2024-02-25"},{"lineNumber":155,"author":{"gitId":"ForAeons"},"content":" new AddPersonCommand(expectedPerson));","lastModifiedDate":"2024-02-26"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddPersonCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-02-26"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":162,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":170,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":175,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":178,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":179,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":183,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":184,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":185,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":186,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":187,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":188,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":190,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":191,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":192,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":193,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":195,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":196,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":200,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":201,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"-"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":205,"author":{"gitId":"ForAeons"},"content":" // invalid nusnet","lastModifiedDate":"2024-02-25"},{"lineNumber":206,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":207,"author":{"gitId":"ForAeons"},"content":" + INVALID_NUSNET_DESC + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":208,"author":{"gitId":"ForAeons"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, NusNet.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":209,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":210,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2017-06-15"},{"lineNumber":211,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":212,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":213,"author":{"gitId":"-"},"content":" + INVALID_TAG_DESC + VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":215,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":216,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":217,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":218,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":222,"author":{"gitId":"ForAeons"},"content":" + NUSNET_DESC_BOB + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"ForAeons"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddPersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":224,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":225,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"-":176,"ForAeons":49}},{"path":"src/test/java/seedu/address/logic/parser/AddressBookParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-06-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ClearCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.DeletePersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ExitCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":22,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.FindPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.HelpCommand;","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.ListPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-05-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-06-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonUtil;","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":"public class AddressBookParserTest {","lastModifiedDate":"2017-07-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private final AddressBookParser parser \u003d new AddressBookParser();","lastModifiedDate":"2017-07-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void parseCommand_add() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" AddPersonCommand command \u003d (AddPersonCommand) parser.parseCommand(PersonUtil.getAddCommand(person));","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" assertEquals(new AddPersonCommand(person), command);","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void parseCommand_clear() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD) instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ClearCommand.COMMAND_WORD + \" 3\") instanceof ClearCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void parseCommand_delete() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":51,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand command \u003d (DeletePersonCommand) parser.parseCommand(","lastModifiedDate":"2024-02-26"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand.COMMAND_WORD + \" \" + INDEX_FIRST_PERSON.getOneBased());","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" assertEquals(new DeletePersonCommand(INDEX_FIRST_PERSON), command);","lastModifiedDate":"2024-02-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void parseCommand_edit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2017-06-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder(person).build();","lastModifiedDate":"2017-06-27"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand command \u003d (EditPersonCommand) parser.parseCommand(EditPersonCommand.COMMAND_WORD + \" \"","lastModifiedDate":"2024-02-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" + INDEX_FIRST_PERSON.getOneBased() + \" \" + PersonUtil.getEditPersonDescriptorDetails(descriptor));","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" assertEquals(new EditPersonCommand(INDEX_FIRST_PERSON, descriptor), command);","lastModifiedDate":"2024-02-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void parseCommand_exit() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD) instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(ExitCommand.COMMAND_WORD + \" 3\") instanceof ExitCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public void parseCommand_find() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" List\u003cString\u003e keywords \u003d Arrays.asList(\"foo\", \"bar\", \"baz\");","lastModifiedDate":"2017-06-12"},{"lineNumber":74,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand command \u003d (FindPersonCommand) parser.parseCommand(","lastModifiedDate":"2024-02-26"},{"lineNumber":75,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand.COMMAND_WORD + \" \" + keywords.stream().collect(Collectors.joining(\" \")));","lastModifiedDate":"2024-02-26"},{"lineNumber":76,"author":{"gitId":"ForAeons"},"content":" assertEquals(new FindPersonCommand(new NameContainsKeywordsPredicate(keywords)), command);","lastModifiedDate":"2024-02-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void parseCommand_help() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD) instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertTrue(parser.parseCommand(HelpCommand.COMMAND_WORD + \" 3\") instanceof HelpCommand);","lastModifiedDate":"2017-06-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void parseCommand_list() throws Exception {","lastModifiedDate":"2017-06-27"},{"lineNumber":87,"author":{"gitId":"ForAeons"},"content":" assertTrue(parser.parseCommand(ListPersonCommand.COMMAND_WORD) instanceof ListPersonCommand);","lastModifiedDate":"2024-02-26"},{"lineNumber":88,"author":{"gitId":"ForAeons"},"content":" assertTrue(parser.parseCommand(ListPersonCommand.COMMAND_WORD + \" 3\") instanceof ListPersonCommand);","lastModifiedDate":"2024-02-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void parseCommand_unrecognisedInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE), ()","lastModifiedDate":"2019-03-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" -\u003e parser.parseCommand(\"\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public void parseCommand_unknownCommand_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_UNKNOWN_COMMAND, () -\u003e parser.parseCommand(\"unknownCommand\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-24"}],"authorContributionMap":{"-":83,"ForAeons":18}},{"path":"src/test/java/seedu/address/logic/parser/DeleteCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-09"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":10,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.DeletePersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * As we are only doing white-box testing, our test cases do not cover path variations","lastModifiedDate":"2017-06-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * outside of the DeleteCommand code. For example, inputs \"1\" and \"1 abc\" take the","lastModifiedDate":"2017-06-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * same path through the DeleteCommand, and therefore we test only one of them.","lastModifiedDate":"2017-06-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * The path variation for those two cases occur inside the ParserUtil, and","lastModifiedDate":"2017-06-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * therefore should be covered by the ParserUtilTest.","lastModifiedDate":"2017-06-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class DeleteCommandParserTest {","lastModifiedDate":"2017-06-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":21,"author":{"gitId":"ForAeons"},"content":" private DeletePersonCommandParser parser \u003d new DeletePersonCommandParser();","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsDeleteCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"ForAeons"},"content":" assertParseSuccess(parser, \"1\", new DeletePersonCommand(INDEX_FIRST_PERSON));","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void parse_invalidArgs_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, \"a\", String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" DeletePersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"-":28,"ForAeons":5}},{"path":"src/test/java/seedu/address/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-05-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private static final String TAG_EMPTY \u003d \" \" + PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditPersonCommand.MESSAGE_USAGE);","lastModifiedDate":"2024-02-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" private EditPersonCommandParser parser \u003d new EditPersonCommandParser();","lastModifiedDate":"2024-02-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":63,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, \"1\", EditPersonCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2024-02-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":66,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":69,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"-5\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"0\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 i/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":84,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2018-09-22"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2018-09-22"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2018-09-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address","lastModifiedDate":"2018-09-22"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2018-09-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC + EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":95,"author":{"gitId":"-"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2017-05-04"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2017-05-04"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_DESC_HUSBAND + TAG_EMPTY, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_EMPTY + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":99,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + TAG_EMPTY + TAG_DESC_FRIEND + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ADDRESS_AMY + VALID_PHONE_AMY,","lastModifiedDate":"2017-07-06"},{"lineNumber":103,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":106,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + TAG_DESC_HUSBAND","lastModifiedDate":"2017-06-06"},{"lineNumber":110,"author":{"gitId":"-"},"content":" + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND;","lastModifiedDate":"2017-06-06"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":112,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":115,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":120,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":121,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":122,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":127,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":134,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":135,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":136,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + NAME_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":137,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":138,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":141,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":142,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":143,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":144,"author":{"gitId":"ForAeons"},"content":" expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":147,"author":{"gitId":"-"},"content":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":149,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":150,"author":{"gitId":"ForAeons"},"content":" expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // address","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + ADDRESS_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":155,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(VALID_ADDRESS_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":156,"author":{"gitId":"ForAeons"},"content":" expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":159,"author":{"gitId":"-"},"content":" // tags","lastModifiedDate":"2017-05-04"},{"lineNumber":160,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + TAG_DESC_FRIEND;","lastModifiedDate":"2017-05-25"},{"lineNumber":161,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":162,"author":{"gitId":"ForAeons"},"content":" expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":166,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":167,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":168,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":169,"author":{"gitId":"-"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2023-07-14"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":171,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":172,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":173,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + PHONE_DESC_BOB;","lastModifiedDate":"2023-07-14"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":175,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":177,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":178,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + INVALID_PHONE_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":180,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":182,"author":{"gitId":"-"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":183,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2023-07-14"},{"lineNumber":184,"author":{"gitId":"-"},"content":" + TAG_DESC_FRIEND + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY + TAG_DESC_FRIEND","lastModifiedDate":"2017-05-25"},{"lineNumber":185,"author":{"gitId":"-"},"content":" + PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND;","lastModifiedDate":"2017-05-25"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":188,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":190,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":191,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC","lastModifiedDate":"2023-07-14"},{"lineNumber":192,"author":{"gitId":"-"},"content":" + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":194,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":195,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":200,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":201,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2017-05-25"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2017-05-04"},{"lineNumber":204,"author":{"gitId":"ForAeons"},"content":" EditPersonCommand expectedCommand \u003d new EditPersonCommand(targetIndex, descriptor);","lastModifiedDate":"2024-02-26"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":206,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":208,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"-":195,"ForAeons":13}},{"path":"src/test/java/seedu/address/logic/parser/FindCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-27"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-06-27"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":11,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.FindPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class FindCommandParserTest {","lastModifiedDate":"2017-06-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":16,"author":{"gitId":"ForAeons"},"content":" private FindPersonCommandParser parser \u003d new FindPersonCommandParser();","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public void parse_emptyArg_throwsParseException() {","lastModifiedDate":"2017-06-27"},{"lineNumber":20,"author":{"gitId":"ForAeons"},"content":" assertParseFailure(parser, \" \", String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand.MESSAGE_USAGE));","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsFindCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // no leading and trailing whitespaces","lastModifiedDate":"2017-06-27"},{"lineNumber":27,"author":{"gitId":"ForAeons"},"content":" FindPersonCommand expectedFindCommand \u003d","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":" new FindPersonCommand(new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\")));","lastModifiedDate":"2024-02-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \"Alice Bob\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // multiple whitespaces between keywords","lastModifiedDate":"2017-06-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \" \\n Alice \\n \\t Bob \\t\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-27"}],"authorContributionMap":{"-":29,"ForAeons":6}},{"path":"src/test/java/seedu/address/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2018-03-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NUSNET_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2018-04-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2018-04-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-03-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class PersonTest {","lastModifiedDate":"2018-03-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2018-03-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public void isSamePerson() {","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" // same nusnet, all other attributes different -\u003e returns true","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE)","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"ForAeons"},"content":" .withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" .withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" .withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"ForAeons"},"content":" .withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2020-12-18"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" // same nusnet, but different case -\u003e returns true","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"ForAeons"},"content":" Person nusnetUpperCase \u003d new PersonBuilder(ALICE)","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_BOB.toUpperCase())","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" Person nusnetLowerCase \u003d new PersonBuilder(ALICE)","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_BOB.toLowerCase())","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" assertTrue(nusnetUpperCase.isSamePerson(nusnetLowerCase));","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" // same name, all other attributes different -\u003e returns false","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" editedAlice \u003d new PersonBuilder(ALICE)","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" .withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" .withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" .withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":" .withTags(VALID_TAG_HUSBAND)","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" Person aliceCopy \u003d new PersonBuilder(ALICE).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(aliceCopy));","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // different type -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(5));","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(BOB));","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-18"},{"lineNumber":99,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2018-04-18"},{"lineNumber":100,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2018-04-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-18"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + ALICE.getName() + \", phone\u003d\" + ALICE.getPhone()","lastModifiedDate":"2019-02-23"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" + \", email\u003d\" + ALICE.getEmail() + \", nusNet\u003d\" + ALICE.getNusNet() + \", address\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":" + ALICE.getAddress() + \", tags\u003d\" + ALICE.getTags() + \"}\";","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertEquals(expected, ALICE.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"-":84,"ForAeons":27}},{"path":"src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.storage.JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"ForAeons"},"content":" private static final String INVALID_NUSNET \u003d \"E012345\";","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d BENSON.getName().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d BENSON.getPhone().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d BENSON.getEmail().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" private static final String VALID_NUSNET \u003d BENSON.getNusNet().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d BENSON.getAddress().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d BENSON.getTags().stream()","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(BENSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertEquals(BENSON, person.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" VALID_NUSNET, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"ForAeons"},"content":" VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"ForAeons"},"content":" VALID_NUSNET, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_NUSNET, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null,","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"ForAeons"},"content":" VALID_NUSNET, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":90,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":95,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":96,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"ForAeons"},"content":" INVALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" VALID_NUSNET, null, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":117,"author":{"gitId":"ForAeons"},"content":" VALID_ADDRESS, invalidTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":118,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"ForAeons"},"content":" @Test","lastModifiedDate":"2024-02-25"},{"lineNumber":122,"author":{"gitId":"ForAeons"},"content":" public void toModelType_invalidNusNet_throwsIllegalValueException() {","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"ForAeons"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_NUSNET,","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"ForAeons"},"content":" VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":126,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d NusNet.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2024-02-25"},{"lineNumber":127,"author":{"gitId":"ForAeons"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-02-25"},{"lineNumber":128,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":130,"author":{"gitId":"ForAeons"},"content":" @Test","lastModifiedDate":"2024-02-25"},{"lineNumber":131,"author":{"gitId":"ForAeons"},"content":" public void toModelType_nullNusNet_throwsIllegalValueException() {","lastModifiedDate":"2024-02-25"},{"lineNumber":132,"author":{"gitId":"ForAeons"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL,","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"ForAeons"},"content":" null, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":134,"author":{"gitId":"ForAeons"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, NusNet.class.getSimpleName());","lastModifiedDate":"2024-02-25"},{"lineNumber":135,"author":{"gitId":"ForAeons"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2024-02-25"},{"lineNumber":136,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":138,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":101,"ForAeons":37}},{"path":"src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-12-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-12-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-12-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-12-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-12-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"ForAeons"},"content":" descriptor.setNusNet(person.getNusNet());","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" * Sets the {@code NusNet} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"ForAeons"},"content":" public EditPersonDescriptorBuilder withNusNet(String nusNet) {","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" descriptor.setNusNet(new seedu.address.model.person.NusNet(nusNet));","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"ForAeons"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":88,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagSet \u003d Stream.of(tags).map(Tag::new).collect(Collectors.toSet());","lastModifiedDate":"2017-12-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" descriptor.setTags(tagSet);","lastModifiedDate":"2017-12-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":96,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":86,"ForAeons":10}},{"path":"src/test/java/seedu/address/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-01-18"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-01-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-01-18"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":"import seedu.address.model.person.NusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-04-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-01-18"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-04-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.util.SampleDataUtil;","lastModifiedDate":"2017-04-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":23,"author":{"gitId":"ForAeons"},"content":" public static final String DEAULT_NUSNET \u003d \"E0123456\";","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" private NusNet nusNet;","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" nusNet \u003d new NusNet(DEAULT_NUSNET);","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" nusNet \u003d personToCopy.getNusNet();","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":77,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":85,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":97,"author":{"gitId":"ForAeons"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"ForAeons"},"content":" * Sets the {@code NusNet} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"ForAeons"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"ForAeons"},"content":" public PersonBuilder withNusNet(String nusNet) {","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"ForAeons"},"content":" this.nusNet \u003d new NusNet(nusNet);","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" return new Person(name, phone, email, nusNet, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"-":95,"ForAeons":14}},{"path":"src/test/java/seedu/address/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-04-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2017-05-09"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2017-05-09"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2017-06-06"},{"lineNumber":6,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NUSNET;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-03-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":12,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.AddPersonCommand;","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"ForAeons"},"content":"import seedu.address.logic.commands.EditPersonCommand.EditPersonDescriptor;","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-03-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":26,"author":{"gitId":"ForAeons"},"content":" return AddPersonCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2024-02-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":33,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":36,"author":{"gitId":"-"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" sb.append(PREFIX_NUSNET + person.getNusNet().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {","lastModifiedDate":"2018-03-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2018-03-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2018-03-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" tags.forEach(s -\u003e sb.append(PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"-":59,"ForAeons":5}},{"path":"src/test/java/seedu/address/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":9,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NUSNET_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"ForAeons"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NUSNET_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-08-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-08-22"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-09-21"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":28,"author":{"gitId":"ForAeons"},"content":" public static final Person ALICE \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"ForAeons"},"content":" .withName(\"Alice Pauline\")","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\")","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"alice@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000001\")","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withPhone(\"94351253\")","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"ForAeons"},"content":" .withTags(\"friends\")","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"ForAeons"},"content":" public static final Person BENSON \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"ForAeons"},"content":" .withName(\"Benson Meier\")","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\")","lastModifiedDate":"2017-09-21"},{"lineNumber":39,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"johnd@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000002\")","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"98765432\")","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"ForAeons"},"content":" .withTags(\"owesMoney\", \"friends\")","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"ForAeons"},"content":" public static final Person CARL \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"ForAeons"},"content":" .withName(\"Carl Kurz\")","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"95352563\")","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"heinz@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000003\")","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"wall street\")","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"ForAeons"},"content":" public static final Person DANIEL \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"ForAeons"},"content":" .withName(\"Daniel Meier\")","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"87652533\")","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"cornelia@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"10th street\")","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000004\")","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"ForAeons"},"content":" .withTags(\"friends\")","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"ForAeons"},"content":" public static final Person ELLE \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"ForAeons"},"content":" .withName(\"Elle Meyer\")","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"9482224\")","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"werner@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000005\")","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"michegan ave\")","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"ForAeons"},"content":" public static final Person FIONA \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"ForAeons"},"content":" .withName(\"Fiona Kunz\")","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"9482427\")","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"lydia@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000006\")","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"little tokyo\")","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"ForAeons"},"content":" public static final Person GEORGE \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"ForAeons"},"content":" .withName(\"George Best\")","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"9482442\")","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"anna@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000007\")","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"4th street\")","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":82,"author":{"gitId":"ForAeons"},"content":" public static final Person HOON \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"ForAeons"},"content":" .withName(\"Hoon Meier\")","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"8482424\")","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"stefan@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000008\")","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"little india\")","lastModifiedDate":"2024-02-25"},{"lineNumber":88,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"ForAeons"},"content":" public static final Person IDA \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":90,"author":{"gitId":"ForAeons"},"content":" .withName(\"Ida Mueller\")","lastModifiedDate":"2024-02-25"},{"lineNumber":91,"author":{"gitId":"ForAeons"},"content":" .withPhone(\"8482131\")","lastModifiedDate":"2024-02-25"},{"lineNumber":92,"author":{"gitId":"ForAeons"},"content":" .withEmail(\"hans@example.com\")","lastModifiedDate":"2024-02-25"},{"lineNumber":93,"author":{"gitId":"ForAeons"},"content":" .withNusNet(\"e0000009\")","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"ForAeons"},"content":" .withAddress(\"chicago ave\")","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":98,"author":{"gitId":"ForAeons"},"content":" public static final Person AMY \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"ForAeons"},"content":" .withName(VALID_NAME_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"ForAeons"},"content":" .withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"ForAeons"},"content":" .withEmail(VALID_EMAIL_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"ForAeons"},"content":" .withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"ForAeons"},"content":" .withTags(VALID_TAG_FRIEND)","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"ForAeons"},"content":" .build();","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"ForAeons"},"content":" public static final Person BOB \u003d new PersonBuilder()","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"ForAeons"},"content":" .withName(VALID_NAME_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"ForAeons"},"content":" .withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"ForAeons"},"content":" .withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"ForAeons"},"content":" .withNusNet(VALID_NUSNET_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"ForAeons"},"content":" .withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"ForAeons"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":115,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":119,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":123,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":125,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":131,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"-":52,"ForAeons":81}}] diff --git a/AY2324S2-CS2103T-F13-1_tp_master/commits.json b/AY2324S2-CS2103T-F13-1_tp_master/commits.json index 341adad0..ceca1ae7 100644 --- a/AY2324S2-CS2103T-F13-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-F13-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"tituschewxj":[{"date":"2024-02-29","commitResults":[{"hash":"a5d9f7eb9eb1127b08cf749d88ae69169c4d1f88","isMergeCommit":false,"messageTitle":"Fix image names to match format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6d3211a0e88f5db52245b4381e13d3fce6f33ced","isMergeCommit":true,"messageTitle":"Merge pull request #18 from saiutkarsh33/branch-DGUpdate","messageBody":"Updated DG, UG, AboutUS","fileTypesAndContributionMap":{}}]}],"saiutkarsh33":[{"date":"2024-02-28","commitResults":[{"hash":"2626f0735b20ca7a92f97fbb45f80ef0d9e44728","isMergeCommit":false,"messageTitle":"DG for 1.1, UG for list and crsname, AboutUs sai","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":91,"deletions":26}}},{"hash":"ae26a89ecf048fe963eafc472cb444520fe56f81","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"42c4eb727a13e87fff925aa54749772738a500e4","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":5}}}]},{"date":"2024-02-29","commitResults":[{"hash":"134167beecc149af659fda9f536957244a476119","isMergeCommit":false,"messageTitle":"Update docs/AboutUs.md","messageBody":"Co-authored-by: Titus Chew \u003c39845485+tituschewxj@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7f4c079b31d38723978e2af21202dc6e47c61c40","isMergeCommit":false,"messageTitle":"Update docs/DeveloperGuide.md","messageBody":"Co-authored-by: Titus Chew \u003c39845485+tituschewxj@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f097f9d3187ba13d0175a3cafc5b442bc47527e9","isMergeCommit":false,"messageTitle":"Update docs/DeveloperGuide.md","messageBody":"Co-authored-by: Titus Chew \u003c39845485+tituschewxj@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1da369a1e9acf5f2acaa9957cbe48df6c5ff5ccf","isMergeCommit":false,"messageTitle":"Edited Dev Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":5}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6674e065b5f8482dfa2bb43cf631e0741001ab13","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-DGUpdate","messageBody":"","fileTypesAndContributionMap":{}}]}],"belligerentbeagle":[{"date":"2024-02-28","commitResults":[{"hash":"c979165ec67a429f6d304c5236ed7ec3566e0b62","isMergeCommit":false,"messageTitle":"Update site configs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"09cc3d1c3de69f59aff99dd36969c3737c674912","isMergeCommit":false,"messageTitle":"Update README, UI and individual team information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":59,"deletions":16}}},{"hash":"d955d34033de8845e840caf5b6bd290413a0a2b4","isMergeCommit":false,"messageTitle":"Fix bug of adding a new line in README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"68daca6fb0cf1babaf26c58e068267f45fee1c6a","isMergeCommit":false,"messageTitle":"Add team page and images","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":133,"deletions":44}}},{"hash":"6d0be963db5532598848839c5f68b904915d20b6","isMergeCommit":false,"messageTitle":"Update site title prefix and suffix and contextualise product name to TAPro","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"aac1c205fa53cb0f9aa26b01fc45cf435262e286","isMergeCommit":false,"messageTitle":"Change description in README to Contact Book and name the product","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"60d843a5083ea2b6897154b090d4d05ede9ebe97","isMergeCommit":false,"messageTitle":"Update User Guide to use TAPros keywords and phrases and edit minor typos like add to addstu","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":12}}}]},{"date":"2024-03-07","commitResults":[{"hash":"926299f8fedb2ec2e8646442869601e230f7d5e1","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateUserGuide","messageBody":"","fileTypesAndContributionMap":{}}]}],"ForAeons":[{"date":"2024-02-26","commitResults":[{"hash":"6841b694f5ac07bae4248ae48f79a54fd43a5248","isMergeCommit":false,"messageTitle":"Fix style","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":61,"deletions":0},"other":{"insertions":315,"deletions":0}}},{"hash":"8c09bb2560784c2efaec4d07f18d719892831684","isMergeCommit":false,"messageTitle":"Remove irrelevant file from pr","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":0,"deletions":315}}},{"hash":"75955d56e390fb202a7eb0888fba0a07edb8a4dd","isMergeCommit":false,"messageTitle":"Fix all testcases and add testcase to test for nusnet id","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":88,"deletions":21},"test-code":{"insertions":221,"deletions":64}}},{"hash":"943e50588b2a35ac4db4c34251892a235b880054","isMergeCommit":false,"messageTitle":"Rename add command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":7,"deletions":7},"other":{"insertions":5,"deletions":5},"test-code":{"insertions":28,"deletions":27}}},{"hash":"f3e4924f5dc12c463f8bc3243d7da976eb57b9c5","isMergeCommit":false,"messageTitle":"Update add command user guide to add student","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"c06f44476c378a5d8f01cfe05aa3d300dd581ad2","isMergeCommit":false,"messageTitle":"Update edit command to include nusnet","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1},"test-code":{"insertions":1,"deletions":0}}},{"hash":"9e83a805d21fd5b12631336f9fc3bba704e6b69f","isMergeCommit":false,"messageTitle":"Update ui to include nusnet id","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":0}}},{"hash":"46232104cb6e61eeb6b54045de5b298bb4b33bc7","isMergeCommit":false,"messageTitle":"Rename crud command to crud person command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":34,"deletions":33},"other":{"insertions":20,"deletions":17},"test-code":{"insertions":116,"deletions":110}}},{"hash":"1da40aea91ac72350011a26ca461d6871e72d65d","isMergeCommit":false,"messageTitle":"Update nus_net json property to adhere to google json style guide","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":7,"deletions":7}}},{"hash":"5c7e98be3a6bc46644d06fb34d6d38cdb9d0e105","isMergeCommit":false,"messageTitle":"Rename crud command parser to crud person command parser","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":6},"other":{"insertions":3,"deletions":3},"test-code":{"insertions":3,"deletions":3}}},{"hash":"d03a2f0837fe69ee26dd4bdeece82296bc03fb02","isMergeCommit":false,"messageTitle":"Rename crud command parser to crud person command parser","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":7,"deletions":7},"other":{"insertions":3,"deletions":3},"test-code":{"insertions":1,"deletions":1}}},{"hash":"27eebabf9d5d39ffc9df45574dd99c0158c60fd2","isMergeCommit":false,"messageTitle":"Rename crud command parser to crud person command parser","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":4}}}]},{"date":"2024-02-27","commitResults":[{"hash":"f256b369da25442b96742e8e22753b3d0b1e9fb4","isMergeCommit":false,"messageTitle":"Update json to meet google json style guide","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"f1b5435fce758f730e73167b51641474600ac4ac","isMergeCommit":true,"messageTitle":"Merge pull request #17 from belligerentbeagle/branch-DocUpdate","messageBody":"Update site wide settings, AboutUs and README","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"28c53ba70778a3fc1849a872212cb4cef88cca99","isMergeCommit":true,"messageTitle":"Merge pull request #23 from tituschewxj/fix-image-names","messageBody":"fix: image names to match format","fileTypesAndContributionMap":{}},{"hash":"c0d3333e9c4ff02ec3e4578a34a9038326425ab4","isMergeCommit":true,"messageTitle":"Merge pull request #25 from belligerentbeagle/branch-PolishUG","messageBody":"Update User Guide to use TAPros keywords and phrases ","fileTypesAndContributionMap":{}},{"hash":"b96185235853da735ca312e625dcea81f3757ac5","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Anant1902/branch-UpdateUserGuide","messageBody":"Update Mark Command in UserGuide.md","fileTypesAndContributionMap":{}}]}],"Anant1902":[{"date":"2024-02-27","commitResults":[{"hash":"90a501b171c0c65fa1287165f7864dfc4d7cc8a9","isMergeCommit":true,"messageTitle":"Merge pull request #9 from ForAeons/xiaoyun/add-student","messageBody":"feat: add student","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"1510a424259e1d30e16e9afb538dbdcece00992d","isMergeCommit":false,"messageTitle":"Update Mark Command in UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":4}}}]}]},"authorFileTypeContributionMap":{"tituschewxj":{"docs":7,"functional-code":0,"test-code":0},"saiutkarsh33":{"docs":87,"functional-code":0,"test-code":0},"belligerentbeagle":{"docs":177,"functional-code":0,"test-code":0},"ForAeons":{"docs":6,"functional-code":228,"test-code":342},"Anant1902":{"docs":13,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tituschewxj":16.97959,"saiutkarsh33":1036.0613,"belligerentbeagle":2464.7756,"ForAeons":166337.83,"Anant1902":21.489794},"authorDisplayNameMap":{"tituschewxj":"CS2103T-F13-1 TITU.. JUN","saiutkarsh33":"CS2103T-F13-1 SEET..ARSH","belligerentbeagle":"CS2103T-F13-1 ETHA..UXIN","ForAeons":"CS2103T-F13-1 WU X..OYUN","Anant1902":"CS2103T-F13-1 ANAN..NKER"}} +{"authorDailyContributionsMap":{"tituschewxj":[{"date":"2024-02-29","commitResults":[{"hash":"a5d9f7eb9eb1127b08cf749d88ae69169c4d1f88","isMergeCommit":false,"messageTitle":"Fix image names to match format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6d3211a0e88f5db52245b4381e13d3fce6f33ced","isMergeCommit":true,"messageTitle":"Merge pull request #18 from saiutkarsh33/branch-DGUpdate","messageBody":"Updated DG, UG, AboutUS","fileTypesAndContributionMap":{}},{"hash":"8f9b8b162ad75c49ffed92908c0997ee7d35a72d","isMergeCommit":true,"messageTitle":"Merge pull request #30 from ForAeons/xiaoyun/update-xiaoyun-md","messageBody":"Update name and contribution to xiaoyun.md","fileTypesAndContributionMap":{}},{"hash":"8929f96f2bd96183b29e3c29d5a7dcf2879dfeb2","isMergeCommit":true,"messageTitle":"Merge pull request #32 from ForAeons/xiaoyun/fix-aboutme-sai","messageBody":"Fix the photo and placement of details of Sai","fileTypesAndContributionMap":{}}]}],"saiutkarsh33":[{"date":"2024-02-28","commitResults":[{"hash":"2626f0735b20ca7a92f97fbb45f80ef0d9e44728","isMergeCommit":false,"messageTitle":"DG for 1.1, UG for list and crsname, AboutUs sai","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":91,"deletions":26}}},{"hash":"ae26a89ecf048fe963eafc472cb444520fe56f81","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"42c4eb727a13e87fff925aa54749772738a500e4","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":5}}}]},{"date":"2024-02-29","commitResults":[{"hash":"134167beecc149af659fda9f536957244a476119","isMergeCommit":false,"messageTitle":"Update docs/AboutUs.md","messageBody":"Co-authored-by: Titus Chew \u003c39845485+tituschewxj@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7f4c079b31d38723978e2af21202dc6e47c61c40","isMergeCommit":false,"messageTitle":"Update docs/DeveloperGuide.md","messageBody":"Co-authored-by: Titus Chew \u003c39845485+tituschewxj@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f097f9d3187ba13d0175a3cafc5b442bc47527e9","isMergeCommit":false,"messageTitle":"Update docs/DeveloperGuide.md","messageBody":"Co-authored-by: Titus Chew \u003c39845485+tituschewxj@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1da369a1e9acf5f2acaa9957cbe48df6c5ff5ccf","isMergeCommit":false,"messageTitle":"Edited Dev Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":5}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6674e065b5f8482dfa2bb43cf631e0741001ab13","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-DGUpdate","messageBody":"","fileTypesAndContributionMap":{}}]}],"belligerentbeagle":[{"date":"2024-02-28","commitResults":[{"hash":"c979165ec67a429f6d304c5236ed7ec3566e0b62","isMergeCommit":false,"messageTitle":"Update site configs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"09cc3d1c3de69f59aff99dd36969c3737c674912","isMergeCommit":false,"messageTitle":"Update README, UI and individual team information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":59,"deletions":16}}},{"hash":"d955d34033de8845e840caf5b6bd290413a0a2b4","isMergeCommit":false,"messageTitle":"Fix bug of adding a new line in README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"68daca6fb0cf1babaf26c58e068267f45fee1c6a","isMergeCommit":false,"messageTitle":"Add team page and images","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":133,"deletions":44}}},{"hash":"6d0be963db5532598848839c5f68b904915d20b6","isMergeCommit":false,"messageTitle":"Update site title prefix and suffix and contextualise product name to TAPro","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"aac1c205fa53cb0f9aa26b01fc45cf435262e286","isMergeCommit":false,"messageTitle":"Change description in README to Contact Book and name the product","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"60d843a5083ea2b6897154b090d4d05ede9ebe97","isMergeCommit":false,"messageTitle":"Update User Guide to use TAPros keywords and phrases and edit minor typos like add to addstu","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":12}}}]},{"date":"2024-03-07","commitResults":[{"hash":"926299f8fedb2ec2e8646442869601e230f7d5e1","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateUserGuide","messageBody":"","fileTypesAndContributionMap":{}}]}],"ForAeons":[{"date":"2024-02-26","commitResults":[{"hash":"6841b694f5ac07bae4248ae48f79a54fd43a5248","isMergeCommit":false,"messageTitle":"Fix style","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":61,"deletions":0},"other":{"insertions":315,"deletions":0}}},{"hash":"8c09bb2560784c2efaec4d07f18d719892831684","isMergeCommit":false,"messageTitle":"Remove irrelevant file from pr","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":0,"deletions":315}}},{"hash":"75955d56e390fb202a7eb0888fba0a07edb8a4dd","isMergeCommit":false,"messageTitle":"Fix all testcases and add testcase to test for nusnet id","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":88,"deletions":21},"test-code":{"insertions":221,"deletions":64}}},{"hash":"943e50588b2a35ac4db4c34251892a235b880054","isMergeCommit":false,"messageTitle":"Rename add command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":7,"deletions":7},"other":{"insertions":5,"deletions":5},"test-code":{"insertions":28,"deletions":27}}},{"hash":"f3e4924f5dc12c463f8bc3243d7da976eb57b9c5","isMergeCommit":false,"messageTitle":"Update add command user guide to add student","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"c06f44476c378a5d8f01cfe05aa3d300dd581ad2","isMergeCommit":false,"messageTitle":"Update edit command to include nusnet","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1},"test-code":{"insertions":1,"deletions":0}}},{"hash":"9e83a805d21fd5b12631336f9fc3bba704e6b69f","isMergeCommit":false,"messageTitle":"Update ui to include nusnet id","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":0}}},{"hash":"46232104cb6e61eeb6b54045de5b298bb4b33bc7","isMergeCommit":false,"messageTitle":"Rename crud command to crud person command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":34,"deletions":33},"other":{"insertions":20,"deletions":17},"test-code":{"insertions":116,"deletions":110}}},{"hash":"1da40aea91ac72350011a26ca461d6871e72d65d","isMergeCommit":false,"messageTitle":"Update nus_net json property to adhere to google json style guide","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":7,"deletions":7}}},{"hash":"5c7e98be3a6bc46644d06fb34d6d38cdb9d0e105","isMergeCommit":false,"messageTitle":"Rename crud command parser to crud person command parser","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":6},"other":{"insertions":3,"deletions":3},"test-code":{"insertions":3,"deletions":3}}},{"hash":"d03a2f0837fe69ee26dd4bdeece82296bc03fb02","isMergeCommit":false,"messageTitle":"Rename crud command parser to crud person command parser","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":7,"deletions":7},"other":{"insertions":3,"deletions":3},"test-code":{"insertions":1,"deletions":1}}},{"hash":"27eebabf9d5d39ffc9df45574dd99c0158c60fd2","isMergeCommit":false,"messageTitle":"Rename crud command parser to crud person command parser","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":4}}}]},{"date":"2024-02-27","commitResults":[{"hash":"f256b369da25442b96742e8e22753b3d0b1e9fb4","isMergeCommit":false,"messageTitle":"Update json to meet google json style guide","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"f1b5435fce758f730e73167b51641474600ac4ac","isMergeCommit":true,"messageTitle":"Merge pull request #17 from belligerentbeagle/branch-DocUpdate","messageBody":"Update site wide settings, AboutUs and README","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"28c53ba70778a3fc1849a872212cb4cef88cca99","isMergeCommit":true,"messageTitle":"Merge pull request #23 from tituschewxj/fix-image-names","messageBody":"fix: image names to match format","fileTypesAndContributionMap":{}},{"hash":"c0d3333e9c4ff02ec3e4578a34a9038326425ab4","isMergeCommit":true,"messageTitle":"Merge pull request #25 from belligerentbeagle/branch-PolishUG","messageBody":"Update User Guide to use TAPros keywords and phrases ","fileTypesAndContributionMap":{}},{"hash":"aed7d69ef79bd6c76a693678891b14f02920536f","isMergeCommit":false,"messageTitle":"Update name and contribution to xiaoyun.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}},{"hash":"b96185235853da735ca312e625dcea81f3757ac5","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Anant1902/branch-UpdateUserGuide","messageBody":"Update Mark Command in UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"b28625694de9e9a8fd8bd9923a689ceb911944d9","isMergeCommit":false,"messageTitle":"Fix the photo and placement of details of Sai","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":9}}}]}],"Anant1902":[{"date":"2024-02-27","commitResults":[{"hash":"90a501b171c0c65fa1287165f7864dfc4d7cc8a9","isMergeCommit":true,"messageTitle":"Merge pull request #9 from ForAeons/xiaoyun/add-student","messageBody":"feat: add student","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"1510a424259e1d30e16e9afb538dbdcece00992d","isMergeCommit":false,"messageTitle":"Update Mark Command in UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":4}}}]}]},"authorFileTypeContributionMap":{"tituschewxj":{"docs":7,"functional-code":0,"test-code":0},"saiutkarsh33":{"docs":82,"functional-code":0,"test-code":0},"belligerentbeagle":{"docs":176,"functional-code":0,"test-code":0},"ForAeons":{"docs":9,"functional-code":228,"test-code":342},"Anant1902":{"docs":13,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tituschewxj":16.97959,"saiutkarsh33":1036.0613,"belligerentbeagle":2464.7756,"ForAeons":166138.28,"Anant1902":21.489794},"authorDisplayNameMap":{"tituschewxj":"CS2103T-F13-1 TITU.. JUN","saiutkarsh33":"CS2103T-F13-1 SEET..ARSH","belligerentbeagle":"CS2103T-F13-1 ETHA..UXIN","ForAeons":"CS2103T-F13-1 WU X..OYUN","Anant1902":"CS2103T-F13-1 ANAN..NKER"}} diff --git a/AY2324S2-CS2103T-T08-2_tp_master/authorship.json b/AY2324S2-CS2103T-T08-2_tp_master/authorship.json index bdabaa58..3d36eda7 100644 --- a/AY2324S2-CS2103T-T08-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T08-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bertrandong"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T08-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"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":"bertrandong"},"content":"## Strack.io","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"* `Strack.io` is a desktop application for **managing customer information and orders**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"bertrandong"},"content":" * For homemade food sellers to keep track of customer orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"bertrandong"},"content":" * Keep records of customer information for easy reference.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"bertrandong"},"content":"* `Strack.io` can help homemade food sellers **organize customer information and orders** so that they know **what** to bake, **how much** to bake and **where to deliver** the order to. This information management tool aims to be **more efficient to use than paper-work or general-purpose excel sheets**. We also aim to **reduce chances of mistakes** such as wrong delivery address, forgetting an order or sending repeated orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"bertrandong"},"content":"* Feature list:","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"bertrandong"},"content":" * Add new customer contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"bertrandong"},"content":" * Edit contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"bertrandong"},"content":" * Search contact based on keywords","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"bertrandong"},"content":" * Create orders, which will be tagged to the respective customer","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"bertrandong"},"content":" * Edit order information","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"bertrandong"},"content":" * List out all active orders","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"bertrandong"},"content":" * Delete order when delivery is done","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"bertrandong"},"content":"* It is named `Strack.io` because it was created to help keep track of snack orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"bertrandong"},"content":"* For the detailed documentation of this project, see the **[Strack.io Product Website](https://ay2324s2-cs2103t-t08-2.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"bertrandong"},"content":"**Acknowledgements**","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"bertrandong"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"bertrandong"},"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":{"-":4,"bertrandong":21}},{"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":"chonghaoen"},"content":"[[Project Website](https://ay2324s2-cs2103t-t08-2.github.io/tp/)]","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"chonghaoen"},"content":"## Strack.io","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"chonghaoen"},"content":"### Nigel Lim","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/nigel27022001.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"chonghaoen"},"content":"[[github](https://github.com/nigel27022001)]","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/nigel.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"chonghaoen"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Scheduling and tracking, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"chonghaoen"},"content":"### Joel Wang","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/joelwang22.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/joelwang22)]","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/joel.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"chonghaoen"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"chonghaoen"},"content":"### Isaac Chong","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/chonghaoen.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/chonghaoen)] [[portfolio](team/isaac.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"chonghaoen"},"content":"### Yang Yibai","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/0-yibai.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/0-yibai)]","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/yibai.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"chonghaoen"},"content":"### Bertrand Ong","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/bertrandong.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/bertrandong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/bertrand.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"chonghaoen":28,"-":29}},{"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":"0-yibai"},"content":"|----------|----------------------------|-----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"0-yibai"},"content":"| `* * *` | new user | see a list of all main functionalities | know what I can do with the app |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"0-yibai"},"content":"| `* * *` | new user | check the explanation of all functions | know what the commands mean |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"0-yibai"},"content":"| `* * *` | second time user | retrieve data I entered last time | |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"0-yibai"},"content":"| `* * *` | forgetful user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | add new contacts into the program | keep information of customers |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | remove contacts from the program | remove information of customers that I no longer do business with |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | find a customer by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | create orders for contacts | know what customers have purchased |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | mark an order as done | distinguish between orders done and not done yet |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"0-yibai"},"content":"| `* *` | new user | see sample data | see what the app looks like when it is in use and try out the functions hands-on |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | edit orders | update orders when customers change them |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | update the contact information | correct mistakes made by me and users when keying in information, and update when users change information |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | archive completed orders | track past orders for accounting purposes |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | mark the stage of an order | track the status of each order precisely |","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"0-yibai"},"content":"| `* *` | busy seller | type the commands fast using shortcuts | save time and improve work efficiency |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller with many customers | search for users who have existing orders | better fulfill the orders |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | track the number of orders each address has | double check for any discrepancies |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | track which deliveries are handed by which postman | know who to approach if there is any issue |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | mark select a bunch of orders as to be delivered together in the next round | |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | hide private contact details | minimize chance of leakage of customer information by accident |","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"0-yibai"},"content":"| `*` | busy seller | get auto-suggestions as I type | type fast and work efficiently |","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"0-yibai"},"content":"| `*` | seller with many customers | sort customer by name | locate a person easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"0-yibai"},"content":"| `*` | careless user | undo delete commands | recover information I accidentally deleted by mistake |","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"0-yibai"},"content":"| `*` | careless user | get a double confirmation warning before I delete anything | reduce chance of deleting information by mistake |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"nigel27022001"},"content":"(For all use cases below, the **System** is the `Strack.io` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC1 - Adding a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"nigel27022001"},"content":"1. User chooses to add a new customer and specifies the required details.","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io displays the added customer contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"nigel27022001"},"content":"* 1a. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"nigel27022001"},"content":" * 1a1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"nigel27022001"},"content":" * 1a2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"nigel27022001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC2 - Delete a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"nigel27022001"},"content":"3. User requests to delete a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io requests for confirmation.","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"nigel27022001"},"content":"5. User confirms.","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"nigel27022001"},"content":"6. Strack.io deletes the contact, displaying the deleted contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"nigel27022001"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC3 - Edit a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"nigel27022001"},"content":"3. User requests to edit the details of a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io edits the details of the person and displays the new contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"nigel27022001"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"nigel27022001"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"nigel27022001"},"content":"* 3b. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"nigel27022001"},"content":" * 3b1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"nigel27022001"},"content":" * 3b2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"nigel27022001"},"content":" Steps 3b1-3b2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC4 - Searching for a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"nigel27022001"},"content":"1. User requests to search for contact based on keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of matching persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list of matching persons is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC5 - Creating an order**","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"nigel27022001"},"content":"1. User chooses to create an order for an existing person and specifies the required details.","lastModifiedDate":"2024-03-06"},{"lineNumber":404,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io displays the added order.","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":406,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":410,"author":{"gitId":"nigel27022001"},"content":"* 1a. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"nigel27022001"},"content":" * 1a1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"nigel27022001"},"content":" * 1a2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"nigel27022001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC6 - Delete an order**","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"nigel27022001"},"content":"3. User requests to delete a specific order in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io requests for confirmation.","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"nigel27022001"},"content":"5. User confirms.","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"nigel27022001"},"content":"6. Strack.io deletes the order, displaying the deleted order.","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"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":448,"author":{"gitId":"0-yibai"},"content":"2. Should be able to hold up to 10000 contacts and 500 active orders without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":449,"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":450,"author":{"gitId":"0-yibai"},"content":"4. Even when the app quits unexpectedly in run time, most information updated in the current session should not be lost when the app re-launches.","lastModifiedDate":"2024-03-06"},{"lineNumber":451,"author":{"gitId":"0-yibai"},"content":"5. Should protect sensitive customer information so that they are not leaked to possible malware on the same device.","lastModifiedDate":"2024-03-06"},{"lineNumber":452,"author":{"gitId":"0-yibai"},"content":"6. The user interface should look clean and organised even when it is populated with a lot of information.","lastModifiedDate":"2024-03-06"},{"lineNumber":453,"author":{"gitId":"0-yibai"},"content":"7. The response time to any action other than fetching archived order history should be within 1 second.","lastModifiedDate":"2024-03-06"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":458,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"0-yibai"},"content":"* **Sensitive customer information**: Customer\u0027s name, email, phone number, address and any other personal information which is saved locally in this app","lastModifiedDate":"2024-03-06"},{"lineNumber":460,"author":{"gitId":"0-yibai"},"content":"* **Stage of an order**: Under preparation, Ready for delivery, Sent for delivery, Received by customer(Completed)","lastModifiedDate":"2024-03-06"},{"lineNumber":461,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"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":468,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"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":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"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":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"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":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"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":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"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":502,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"nigel27022001":106,"0-yibai":32,"-":374}},{"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":"bertrandong"},"content":"title: Strack.io","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T08-2/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":"bertrandong"},"content":"**Strack.io is a desktop application for managing customer information and orders.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"bertrandong"},"content":"* If you are interested in using Strack.io, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"bertrandong"},"content":"* If you are interested about developing Strack.io, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-06"},{"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":"bertrandong"},"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":{"-":14,"bertrandong":6}},{"path":"docs/team/bertrand.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bertrandong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"bertrandong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"bertrandong"},"content":"title: Bertrand\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"bertrandong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"bertrandong"},"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":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"bertrandong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"bertrandong":10}},{"path":"docs/team/isaac.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"layout: page","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"title: Isaac\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"chonghaoen"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"chonghaoen"},"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-05"},{"lineNumber":9,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"chonghaoen"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"chonghaoen":10}},{"path":"docs/team/joel.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Joelwang22"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Joelwang22"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Joelwang22"},"content":"title: Joel\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Joelwang22"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Joelwang22"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Joelwang22"},"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":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Joelwang22"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Joelwang22":10}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bertrandong"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T08-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"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":"bertrandong"},"content":"## Strack.io","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"* `Strack.io` is a desktop application for **managing customer information and orders**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"bertrandong"},"content":" * For homemade food sellers to keep track of customer orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"bertrandong"},"content":" * Keep records of customer information for easy reference.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"bertrandong"},"content":"* `Strack.io` can help homemade food sellers **organize customer information and orders** so that they know **what** to bake, **how much** to bake and **where to deliver** the order to. This information management tool aims to be **more efficient to use than paper-work or general-purpose excel sheets**. We also aim to **reduce chances of mistakes** such as wrong delivery address, forgetting an order or sending repeated orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"bertrandong"},"content":"* Feature list:","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"bertrandong"},"content":" * Add new customer contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"bertrandong"},"content":" * Edit contact information","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"bertrandong"},"content":" * Search contact based on keywords","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"bertrandong"},"content":" * Create orders, which will be tagged to the respective customer","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"bertrandong"},"content":" * Edit order information","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"bertrandong"},"content":" * List out all active orders","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"bertrandong"},"content":" * Delete order when delivery is done","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"bertrandong"},"content":"* It is named `Strack.io` because it was created to help keep track of snack orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"bertrandong"},"content":"* For the detailed documentation of this project, see the **[Strack.io Product Website](https://ay2324s2-cs2103t-t08-2.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"bertrandong"},"content":"**Acknowledgements**","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"bertrandong"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"bertrandong"},"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":{"-":4,"bertrandong":21}},{"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":"chonghaoen"},"content":"[[Project Website](https://ay2324s2-cs2103t-t08-2.github.io/tp/)]","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"chonghaoen"},"content":"## Strack.io","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"chonghaoen"},"content":"### Nigel Lim","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/nigel27022001.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"chonghaoen"},"content":"[[github](https://github.com/nigel27022001)]","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/nigel.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"chonghaoen"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Scheduling and tracking, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"chonghaoen"},"content":"### Joel Wang","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/joelwang22.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/joelwang22)]","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/joel.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"chonghaoen"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"chonghaoen"},"content":"### Isaac Chong","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/chonghaoen.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/chonghaoen)] [[portfolio](team/isaac.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"chonghaoen"},"content":"### Yang Yibai","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/0-yibai.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/0-yibai)]","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/yibai.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"chonghaoen"},"content":"### Bertrand Ong","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"chonghaoen"},"content":"\u003cimg src\u003d\"images/bertrandong.png.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chonghaoen"},"content":"[[github](http://github.com/bertrandong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"chonghaoen"},"content":"[[portfolio](team/bertrand.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chonghaoen"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"chonghaoen":28,"-":29}},{"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":"0-yibai"},"content":"|----------|----------------------------|-----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"0-yibai"},"content":"| `* * *` | new user | see a list of all main functionalities | know what I can do with the app |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"0-yibai"},"content":"| `* * *` | new user | check the explanation of all functions | know what the commands mean |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"0-yibai"},"content":"| `* * *` | second time user | retrieve data I entered last time | |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"0-yibai"},"content":"| `* * *` | forgetful user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | add new contacts into the program | keep information of customers |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | remove contacts from the program | remove information of customers that I no longer do business with |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | find a customer by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | create orders for contacts | know what customers have purchased |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"0-yibai"},"content":"| `* * *` | seller | mark an order as done | distinguish between orders done and not done yet |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"0-yibai"},"content":"| `* *` | new user | see sample data | see what the app looks like when it is in use and try out the functions hands-on |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | edit orders | update orders when customers change them |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | update the contact information | correct mistakes made by me and users when keying in information, and update when users change information |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | archive completed orders | track past orders for accounting purposes |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller | mark the stage of an order | track the status of each order precisely |","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"0-yibai"},"content":"| `* *` | busy seller | type the commands fast using shortcuts | save time and improve work efficiency |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"0-yibai"},"content":"| `* *` | seller with many customers | search for users who have existing orders | better fulfill the orders |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | track the number of orders each address has | double check for any discrepancies |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | track which deliveries are handed by which postman | know who to approach if there is any issue |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | mark select a bunch of orders as to be delivered together in the next round | |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"0-yibai"},"content":"| `*` | seller | hide private contact details | minimize chance of leakage of customer information by accident |","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"0-yibai"},"content":"| `*` | busy seller | get auto-suggestions as I type | type fast and work efficiently |","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"0-yibai"},"content":"| `*` | seller with many customers | sort customer by name | locate a person easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"0-yibai"},"content":"| `*` | careless user | undo delete commands | recover information I accidentally deleted by mistake |","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"0-yibai"},"content":"| `*` | careless user | get a double confirmation warning before I delete anything | reduce chance of deleting information by mistake |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"nigel27022001"},"content":"(For all use cases below, the **System** is the `Strack.io` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC1 - Adding a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"nigel27022001"},"content":"1. User chooses to add a new customer and specifies the required details.","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io displays the added customer contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"nigel27022001"},"content":"* 1a. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"nigel27022001"},"content":" * 1a1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"nigel27022001"},"content":" * 1a2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"nigel27022001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC2 - Delete a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"nigel27022001"},"content":"3. User requests to delete a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io requests for confirmation.","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"nigel27022001"},"content":"5. User confirms.","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"nigel27022001"},"content":"6. Strack.io deletes the contact, displaying the deleted contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"nigel27022001"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC3 - Edit a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"nigel27022001"},"content":"3. User requests to edit the details of a specific person in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io edits the details of the person and displays the new contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"nigel27022001"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"nigel27022001"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"nigel27022001"},"content":"* 3b. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"nigel27022001"},"content":" * 3b1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"nigel27022001"},"content":" * 3b2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"nigel27022001"},"content":" Steps 3b1-3b2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC4 - Searching for a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"nigel27022001"},"content":"1. User requests to search for contact based on keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of matching persons.","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"nigel27022001"},"content":"* 2a. The list of matching persons is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC5 - Creating an order**","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"nigel27022001"},"content":"1. User chooses to create an order for an existing person and specifies the required details.","lastModifiedDate":"2024-03-06"},{"lineNumber":404,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io displays the added order.","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":406,"author":{"gitId":"nigel27022001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"nigel27022001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":410,"author":{"gitId":"nigel27022001"},"content":"* 1a. Strack.io detects an error in the entered data.","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"nigel27022001"},"content":" * 1a1. Strack.io shows the missing/incorrect field.","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"nigel27022001"},"content":" * 1a2. User enters new data.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"nigel27022001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"nigel27022001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"nigel27022001"},"content":"**Use case: UC6 - Delete an order**","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"nigel27022001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"nigel27022001"},"content":"1. User requests to list orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"nigel27022001"},"content":"2. Strack.io shows a list of orders.","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"nigel27022001"},"content":"3. User requests to delete a specific order in the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"nigel27022001"},"content":"4. Strack.io requests for confirmation.","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"nigel27022001"},"content":"5. User confirms.","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"nigel27022001"},"content":"6. Strack.io deletes the order, displaying the deleted order.","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"nigel27022001"},"content":" * 3a1. Strack.io shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"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":448,"author":{"gitId":"0-yibai"},"content":"2. Should be able to hold up to 10000 contacts and 500 active orders without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":449,"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":450,"author":{"gitId":"0-yibai"},"content":"4. Even when the app quits unexpectedly in run time, most information updated in the current session should not be lost when the app re-launches.","lastModifiedDate":"2024-03-06"},{"lineNumber":451,"author":{"gitId":"0-yibai"},"content":"5. Should protect sensitive customer information so that they are not leaked to possible malware on the same device.","lastModifiedDate":"2024-03-06"},{"lineNumber":452,"author":{"gitId":"0-yibai"},"content":"6. The user interface should look clean and organised even when it is populated with a lot of information.","lastModifiedDate":"2024-03-06"},{"lineNumber":453,"author":{"gitId":"0-yibai"},"content":"7. The response time to any action other than fetching archived order history should be within 1 second.","lastModifiedDate":"2024-03-06"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":458,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"0-yibai"},"content":"* **Sensitive customer information**: Customer\u0027s name, email, phone number, address and any other personal information which is saved locally in this app","lastModifiedDate":"2024-03-06"},{"lineNumber":460,"author":{"gitId":"0-yibai"},"content":"* **Stage of an order**: Under preparation, Ready for delivery, Sent for delivery, Received by customer(Completed)","lastModifiedDate":"2024-03-06"},{"lineNumber":461,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"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":468,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"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":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"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":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"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":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"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":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"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":502,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"nigel27022001":106,"0-yibai":32,"-":374}},{"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":"Joelwang22"},"content":"Strack.io is a **desktop app for Homemade food sellers to manage contacts of their customers, 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, Strack.io can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"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":"-"},"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":" * `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":"Joelwang22"},"content":"Format: `edit c/CUSTOMER_ID [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2024-03-07"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"Joelwang22"},"content":"* Edits the person of the specified `CUSTOMER_ID`. The customer_id refers to the number shown in the person\u0027s contact under \"customer id\". The customer id **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"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":"Joelwang22"},"content":"* `edit c/1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the person with customer_id of 1 to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":110,"author":{"gitId":"Joelwang22"},"content":"* `edit c/2 n/Betsy Crower t/` Edits the name of the person with customer_id of 2 to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-03-07"},{"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":"Joelwang22"},"content":"Finds persons based on name, phone number or customer id.","lastModifiedDate":"2024-03-07"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"Joelwang22"},"content":"Format: `find [n/NAME] [c/CUSTOMER_ID] [p/PHONE_NUMBER]`","lastModifiedDate":"2024-03-07"},{"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":"Joelwang22"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2024-03-07"},{"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":"Joelwang22"},"content":"* Persons matching at least one of the specified information will be returned (i.e. `OR` search).","lastModifiedDate":"2024-03-07"},{"lineNumber":123,"author":{"gitId":"Joelwang22"},"content":" Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":124,"author":{"gitId":"Joelwang22"},"content":"* `n/Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2024-03-07"},{"lineNumber":125,"author":{"gitId":"Joelwang22"},"content":"* `n/Hans Bo c/12` will return `Hans Bo`, as well as person with customer id `12`","lastModifiedDate":"2024-03-07"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"Joelwang22"},"content":"* `find c/John` returns `john` and `John Doe`","lastModifiedDate":"2024-03-07"},{"lineNumber":129,"author":{"gitId":"Joelwang22"},"content":"* `find c/alex` returns `Alex`\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":130,"author":{"gitId":"Joelwang22"},"content":" ![result for \u0027find alex\u0027](images/findAlexResult.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":131,"author":{"gitId":"Joelwang22"},"content":"* `find c/ 19` returns person with customer id of `19`","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"Joelwang22"},"content":"* `find p/85012345` returns person with phone number of `85012345`","lastModifiedDate":"2024-03-07"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"Joelwang22"},"content":"Format: `delete c/CUSTOMER_ID`","lastModifiedDate":"2024-03-07"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"Joelwang22"},"content":"* Deletes the person of the specified `CUSTOMER_ID`.","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"Joelwang22"},"content":"* The customer_id refers to the number shown under customer id in the displayed person contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"Joelwang22"},"content":"* The customer_id **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"Joelwang22"},"content":"* `list` followed by `delete c/2` deletes the person with customer_id of `2` in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"Joelwang22"},"content":"* `find Betsy` followed by `delete c/1` deletes the person with customer_id of `1` in the results of the `find` command.","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":148,"author":{"gitId":"Joelwang22"},"content":"### Creating of orders : `order`","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"Joelwang22"},"content":"Assigns an order to a specified person in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"Joelwang22"},"content":"Format: `order p/PHONE_NUMBER`","lastModifiedDate":"2024-03-07"},{"lineNumber":153,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":154,"author":{"gitId":"Joelwang22"},"content":"* Orders are assigned to person with specified `PHONE_NUMBER`.","lastModifiedDate":"2024-03-07"},{"lineNumber":155,"author":{"gitId":"Joelwang22"},"content":"* Strack will prompt `Input Products`.","lastModifiedDate":"2024-03-07"},{"lineNumber":156,"author":{"gitId":"Joelwang22"},"content":"* Follow up with products to be added to the order using the following format. Format: `pn/PRODUCT_NAME pq/PRODUCT_QUANTITY`.","lastModifiedDate":"2024-03-07"},{"lineNumber":157,"author":{"gitId":"Joelwang22"},"content":"* This can be repeated as many times as necessary.","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"Joelwang22"},"content":"* When done adding products, simply type `done`,","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"Joelwang22"},"content":"* `order p/99887766` will create an order for person with phone number `99887766` followed by `pn/Cupcake pq/2` and `pn/Cookie pq/2` ending with `done` \u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"Joelwang22"},"content":"![result for creating order for alex](images/addOrderResult.png) ","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"Joelwang22"},"content":"\u003cbr\u003e![system interaction for order creation](images/systemCreateOrder.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"Joelwang22"},"content":"### Editing of orders `edit`","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"Joelwang22"},"content":"Edits an existing order of a specific person in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":168,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"Joelwang22"},"content":"Format: `edit o/ORDER_ID pn/PRODUCT_NAME pq/PRODUCT_QUANTITY`","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"Joelwang22"},"content":"* `ORDER_ID` is a unique number for each order.","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"Joelwang22"},"content":"* The order id refers to the number shown under order id in the displayed persons contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"Joelwang22"},"content":"* Products are edited based on `PRODUCT_NAME`.","lastModifiedDate":"2024-03-07"},{"lineNumber":174,"author":{"gitId":"Joelwang22"},"content":"* To remove product from order, specify `PRODUCT_QUANTITY` as `0`.","lastModifiedDate":"2024-03-07"},{"lineNumber":175,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"Joelwang22"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"Joelwang22"},"content":"* `edit o/1 pn/Chicken Pie pq/2 pn/Macaron pq/6` will edit the order with order id of 1 and change `Chiken Pie` quantity to `2` and `Macaron` quantity to `6`.","lastModifiedDate":"2024-03-07"},{"lineNumber":178,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":179,"author":{"gitId":"Joelwang22"},"content":"### Listing of orders: `list orders`","lastModifiedDate":"2024-03-07"},{"lineNumber":180,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":181,"author":{"gitId":"Joelwang22"},"content":"Lists all ongoing orders in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":183,"author":{"gitId":"Joelwang22"},"content":"Format: `list orders`","lastModifiedDate":"2024-03-07"},{"lineNumber":184,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"Joelwang22"},"content":"* ongoing orders will be displayed sorted by `ORDER_ID`.","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"Joelwang22"},"content":"* The order id refers to the number shown under order id in the displayed persons contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":187,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":188,"author":{"gitId":"Joelwang22"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":189,"author":{"gitId":"Joelwang22"},"content":"* `list orders` might display the following:","lastModifiedDate":"2024-03-07"},{"lineNumber":190,"author":{"gitId":"Joelwang22"},"content":"![result for listing orders](images/listOrderResult.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":191,"author":{"gitId":"Joelwang22"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":192,"author":{"gitId":"Joelwang22"},"content":"### Deleting of orders: `delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":193,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":194,"author":{"gitId":"Joelwang22"},"content":"Deletes an ongoing order in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":195,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":196,"author":{"gitId":"Joelwang22"},"content":"Format: `delete o/ORDER_ID`","lastModifiedDate":"2024-03-07"},{"lineNumber":197,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":198,"author":{"gitId":"Joelwang22"},"content":"* `ORDER_ID` refers to the number shown under order id in the displayed persons contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":199,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":200,"author":{"gitId":"Joelwang22"},"content":"Example:","lastModifiedDate":"2024-03-07"},{"lineNumber":201,"author":{"gitId":"Joelwang22"},"content":"* `delete o/19` will delete order with `ORDER_ID` of `19`.","lastModifiedDate":"2024-03-07"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"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":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":221,"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":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":223,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":224,"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":225,"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":226,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":228,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"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":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":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":243,"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":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":245,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":247,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"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":252,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"Joelwang22"},"content":"**Delete customer** | `delete c/CUSTOMER_ID`\u003cbr\u003e e.g., `delete c/3`","lastModifiedDate":"2024-03-07"},{"lineNumber":254,"author":{"gitId":"Joelwang22"},"content":"**Edit customer** | `edit c/CUSTOMER_ID [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":"2024-03-07"},{"lineNumber":255,"author":{"gitId":"Joelwang22"},"content":"**Find** | `find [n/NAME] [c/CUSTOMER_ID] [p/PHONE_NUMBER]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2024-03-07"},{"lineNumber":256,"author":{"gitId":"Joelwang22"},"content":"**List contacts** | `list`","lastModifiedDate":"2024-03-07"},{"lineNumber":257,"author":{"gitId":"Joelwang22"},"content":"**List orders** | `list orders`","lastModifiedDate":"2024-03-07"},{"lineNumber":258,"author":{"gitId":"Joelwang22"},"content":"**Create order** | `order`","lastModifiedDate":"2024-03-07"},{"lineNumber":259,"author":{"gitId":"Joelwang22"},"content":"**Delete order** | `delete o/ORDER_ID`","lastModifiedDate":"2024-03-07"},{"lineNumber":260,"author":{"gitId":"Joelwang22"},"content":"**Edit order** | `edit o/ORDER_ID pn/PRODUCT_NAME pq/PRODUCT_QUANTITY`","lastModifiedDate":"2024-03-07"},{"lineNumber":261,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Joelwang22":83,"-":178}},{"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":"bertrandong"},"content":"title: Strack.io","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T08-2/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":"bertrandong"},"content":"**Strack.io is a desktop application for managing customer information and orders.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"bertrandong"},"content":"* If you are interested in using Strack.io, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"bertrandong"},"content":"* If you are interested about developing Strack.io, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-06"},{"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":"bertrandong"},"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":{"-":14,"bertrandong":6}},{"path":"docs/team/bertrand.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bertrandong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"bertrandong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"bertrandong"},"content":"title: Bertrand\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"bertrandong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"bertrandong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"bertrandong"},"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":"bertrandong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"bertrandong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"bertrandong":10}},{"path":"docs/team/isaac.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chonghaoen"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"chonghaoen"},"content":"layout: page","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"chonghaoen"},"content":"title: Isaac\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"chonghaoen"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"chonghaoen"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"chonghaoen"},"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-05"},{"lineNumber":9,"author":{"gitId":"chonghaoen"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"chonghaoen"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"chonghaoen":10}},{"path":"docs/team/joel.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Joelwang22"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Joelwang22"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Joelwang22"},"content":"title: Joel\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Joelwang22"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Joelwang22"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Joelwang22"},"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":"Joelwang22"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Joelwang22"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Joelwang22":10}},{"path":"docs/team/nigel.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"nigel27022001"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"nigel27022001"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"nigel27022001"},"content":"title: Nigel\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"nigel27022001"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"nigel27022001"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"nigel27022001"},"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":"nigel27022001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"nigel27022001"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"nigel27022001"},"content":"1. Use Cases in the Project Developer Guide.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"nigel27022001":11}}] diff --git a/AY2324S2-CS2103T-T08-2_tp_master/commits.json b/AY2324S2-CS2103T-T08-2_tp_master/commits.json index ad716f1b..9c442827 100644 --- a/AY2324S2-CS2103T-T08-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T08-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"nigel27022001":[{"date":"2024-03-06","commitResults":[{"hash":"a3f2efb36fae29426785f1d92b7f5bdc1d3e320c","isMergeCommit":false,"messageTitle":"Add Use Cases to Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":117,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"c88c0dccf094a9a38c3c3f703c6412e4112c57da","isMergeCommit":false,"messageTitle":"Fix Style Check Mistakes in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"9392adf069991ed83df521e384a452b9e5641771","isMergeCommit":false,"messageTitle":"Fix Readme.md stylecheck","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"98981b1b46aef54015ab4c2e51917fc9786c7582","isMergeCommit":true,"messageTitle":"Merge pull request #12 from 0-yibai/yibai/update-DG","messageBody":"Add user stories, NFR, glossary to developer guide","fileTypesAndContributionMap":{}},{"hash":"88ec1e05df514261102dfee4c5562885d235bd4b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of github.com:nigel27022001/tp into branch-DeveloperGuide","messageBody":"# Conflicts:\n#\tREADME.md\n","fileTypesAndContributionMap":{}}]}],"chonghaoen":[{"date":"2024-03-05","commitResults":[{"hash":"14870afb017e2eed2057ce3eb7976057cf246b02","isMergeCommit":false,"messageTitle":"Add Isaac info to team","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"5861bb187f7105d4e745a9e2fa2e00aa6885d083","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/chonghaoen/tp","messageBody":"* \u0027master\u0027 of https://github.com/chonghaoen/tp:\n Fix Readme.md stylecheck\n Fix Style Check Mistakes in DeveloperGuide.md\n Add new line to end README for CI\n Add user stories, NFR, glossary to developer guide\n Add Use Cases to Developer Guide\n Update Readme\n","fileTypesAndContributionMap":{}},{"hash":"4bbbc8e21ae1caac7f0d1abd3429b508c801d911","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a2ddcbf5d586723e6390ca63733424676163515f","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":30}}},{"hash":"17e4abb7033389c5632174c827518b6e040d4dba","isMergeCommit":true,"messageTitle":"Merge pull request #15 from chonghaoen/update-aboutus","messageBody":"Update aboutus","fileTypesAndContributionMap":{}},{"hash":"d8fbe816c10a2dc73b93881f52a7d76a3d1d8e50","isMergeCommit":false,"messageTitle":"Fix style of isaac.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"0579236cd360d2d091c2946f5a8df9ad4e5c0a63","isMergeCommit":true,"messageTitle":"Merge pull request #8 from chonghaoen/add-isaac-info","messageBody":"Add Isaac info to team","fileTypesAndContributionMap":{}}]}],"0-yibai":[{"date":"2024-03-06","commitResults":[{"hash":"8739bdf08fe38755088d813c54a6153920c984da","isMergeCommit":false,"messageTitle":"Add user stories, NFR, glossary to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":13}}}]},{"date":"2024-03-07","commitResults":[{"hash":"8f2cd446594b6c4e3189b55c92b616ddef2fbc87","isMergeCommit":false,"messageTitle":"Add new line to end README for CI","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"4823adf9c3a62bb0add4ee20b14590f22c682ea9","isMergeCommit":true,"messageTitle":"Merge pull request #11 from nigel27022001/branch-DeveloperGuide","messageBody":"Add Use Cases to Developer Guide","fileTypesAndContributionMap":{}}]}],"Joelwang22":[{"date":"2024-03-07","commitResults":[{"hash":"eb0ff60b302d72ecfbc01b5a8d81da865ae0bd53","isMergeCommit":false,"messageTitle":"Add Joel info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"ebfa2a444075165a819c5be2f99ab912bb8ddae5","isMergeCommit":true,"messageTitle":"Merge pull request #17 from Joelwang22/add-joel-info","messageBody":"Add Joel info","fileTypesAndContributionMap":{}}]}],"bertrandong":[{"date":"2024-03-06","commitResults":[{"hash":"f26c708404035ca3e20cb70908f4ba14d0c2bd1b","isMergeCommit":false,"messageTitle":"Update Readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":15}}},{"hash":"35198c31abf6a5340efbcc8ed92139f63ad6e156","isMergeCommit":true,"messageTitle":"Merge pull request #10 from bertrandong/update-readme","messageBody":"Update Readme","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"d9fb24f15e48de612ce3b9d71e0fcea9900c580d","isMergeCommit":false,"messageTitle":"Add Bertrand info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"f25d5d8baf872c328446f81c85f3e5ec52be21bc","isMergeCommit":true,"messageTitle":"Merge pull request #16 from bertrandong/add-bertrand-info","messageBody":"Add Bertrand info","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"nigel27022001":{"docs":106,"functional-code":0,"test-code":0},"chonghaoen":{"docs":38,"functional-code":0,"test-code":0},"0-yibai":{"docs":32,"functional-code":0,"test-code":0},"Joelwang22":{"docs":10,"functional-code":0,"test-code":0},"bertrandong":{"docs":37,"functional-code":0,"test-code":0}},"authorContributionVariance":{"nigel27022001":1013.81635,"chonghaoen":239.28572,"0-yibai":139.53572,"Joelwang22":6.6326528,"bertrandong":119.34693},"authorDisplayNameMap":{"nigel27022001":"CS2103T-T08-2 NIGE..TONG","chonghaoen":"CS2103T-T08-2 ISAA..O EN","0-yibai":"CS2103T-T08-2 YANG..IBAI","Joelwang22":"CS2103T-T08-2 WANG..JOEL","bertrandong":"CS2103T-T08-2 ONG ..RAND"}} +{"authorDailyContributionsMap":{"nigel27022001":[{"date":"2024-03-06","commitResults":[{"hash":"a3f2efb36fae29426785f1d92b7f5bdc1d3e320c","isMergeCommit":false,"messageTitle":"Add Use Cases to Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":117,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"c88c0dccf094a9a38c3c3f703c6412e4112c57da","isMergeCommit":false,"messageTitle":"Fix Style Check Mistakes in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"9392adf069991ed83df521e384a452b9e5641771","isMergeCommit":false,"messageTitle":"Fix Readme.md stylecheck","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"98981b1b46aef54015ab4c2e51917fc9786c7582","isMergeCommit":true,"messageTitle":"Merge pull request #12 from 0-yibai/yibai/update-DG","messageBody":"Add user stories, NFR, glossary to developer guide","fileTypesAndContributionMap":{}},{"hash":"88ec1e05df514261102dfee4c5562885d235bd4b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of github.com:nigel27022001/tp into branch-DeveloperGuide","messageBody":"# Conflicts:\n#\tREADME.md\n","fileTypesAndContributionMap":{}},{"hash":"a159766918130480cd19f897782910f9226f46ed","isMergeCommit":false,"messageTitle":"Add nigel.md file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":0}}},{"hash":"ef0ca2465276d9c2938e106c80d485519938847b","isMergeCommit":true,"messageTitle":"Merge pull request #19 from nigel27022001/branch-Nigel-Info","messageBody":"Add nigel.md file","fileTypesAndContributionMap":{}}]}],"chonghaoen":[{"date":"2024-03-05","commitResults":[{"hash":"14870afb017e2eed2057ce3eb7976057cf246b02","isMergeCommit":false,"messageTitle":"Add Isaac info to team","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"5861bb187f7105d4e745a9e2fa2e00aa6885d083","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/chonghaoen/tp","messageBody":"* \u0027master\u0027 of https://github.com/chonghaoen/tp:\n Fix Readme.md stylecheck\n Fix Style Check Mistakes in DeveloperGuide.md\n Add new line to end README for CI\n Add user stories, NFR, glossary to developer guide\n Add Use Cases to Developer Guide\n Update Readme\n","fileTypesAndContributionMap":{}},{"hash":"4bbbc8e21ae1caac7f0d1abd3429b508c801d911","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a2ddcbf5d586723e6390ca63733424676163515f","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":30}}},{"hash":"17e4abb7033389c5632174c827518b6e040d4dba","isMergeCommit":true,"messageTitle":"Merge pull request #15 from chonghaoen/update-aboutus","messageBody":"Update aboutus","fileTypesAndContributionMap":{}},{"hash":"d8fbe816c10a2dc73b93881f52a7d76a3d1d8e50","isMergeCommit":false,"messageTitle":"Fix style of isaac.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"0579236cd360d2d091c2946f5a8df9ad4e5c0a63","isMergeCommit":true,"messageTitle":"Merge pull request #8 from chonghaoen/add-isaac-info","messageBody":"Add Isaac info to team","fileTypesAndContributionMap":{}}]}],"0-yibai":[{"date":"2024-03-06","commitResults":[{"hash":"8739bdf08fe38755088d813c54a6153920c984da","isMergeCommit":false,"messageTitle":"Add user stories, NFR, glossary to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":13}}}]},{"date":"2024-03-07","commitResults":[{"hash":"8f2cd446594b6c4e3189b55c92b616ddef2fbc87","isMergeCommit":false,"messageTitle":"Add new line to end README for CI","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"4823adf9c3a62bb0add4ee20b14590f22c682ea9","isMergeCommit":true,"messageTitle":"Merge pull request #11 from nigel27022001/branch-DeveloperGuide","messageBody":"Add Use Cases to Developer Guide","fileTypesAndContributionMap":{}}]}],"Joelwang22":[{"date":"2024-03-07","commitResults":[{"hash":"eb0ff60b302d72ecfbc01b5a8d81da865ae0bd53","isMergeCommit":false,"messageTitle":"Add Joel info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"ebfa2a444075165a819c5be2f99ab912bb8ddae5","isMergeCommit":true,"messageTitle":"Merge pull request #17 from Joelwang22/add-joel-info","messageBody":"Add Joel info","fileTypesAndContributionMap":{}},{"hash":"9ccec53486f08bd4a4a9d7f431da43edd86f0f6f","isMergeCommit":false,"messageTitle":"Update UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":22}}},{"hash":"0ae19ef608d26acb8cd4b53b3eaf1b52a6eb62ea","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Joelwang22/branch-UserGuide","messageBody":"Update UserGuide","fileTypesAndContributionMap":{}},{"hash":"0379ed501219a656a4b0257f1744680535991d37","isMergeCommit":false,"messageTitle":"Fix intro of UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"36bc0f09986483e04a58bd4af29fcf6b8df2d2fb","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Joelwang22/branch-UserGuide","messageBody":"Fix intro of UserGuide","fileTypesAndContributionMap":{}}]}],"bertrandong":[{"date":"2024-03-06","commitResults":[{"hash":"f26c708404035ca3e20cb70908f4ba14d0c2bd1b","isMergeCommit":false,"messageTitle":"Update Readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":15}}},{"hash":"35198c31abf6a5340efbcc8ed92139f63ad6e156","isMergeCommit":true,"messageTitle":"Merge pull request #10 from bertrandong/update-readme","messageBody":"Update Readme","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"d9fb24f15e48de612ce3b9d71e0fcea9900c580d","isMergeCommit":false,"messageTitle":"Add Bertrand info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"f25d5d8baf872c328446f81c85f3e5ec52be21bc","isMergeCommit":true,"messageTitle":"Merge pull request #16 from bertrandong/add-bertrand-info","messageBody":"Add Bertrand info","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"nigel27022001":{"docs":117,"functional-code":0,"test-code":0},"chonghaoen":{"docs":38,"functional-code":0,"test-code":0},"0-yibai":{"docs":32,"functional-code":0,"test-code":0},"Joelwang22":{"docs":93,"functional-code":0,"test-code":0},"bertrandong":{"docs":37,"functional-code":0,"test-code":0}},"authorContributionVariance":{"nigel27022001":1022.5153,"chonghaoen":239.28572,"0-yibai":139.53572,"Joelwang22":939.25,"bertrandong":119.34693},"authorDisplayNameMap":{"nigel27022001":"CS2103T-T08-2 NIGE..TONG","chonghaoen":"CS2103T-T08-2 ISAA..O EN","0-yibai":"CS2103T-T08-2 YANG..IBAI","Joelwang22":"CS2103T-T08-2 WANG..JOEL","bertrandong":"CS2103T-T08-2 ONG ..RAND"}} diff --git a/AY2324S2-CS2103T-T08-3_tp_master/authorship.json b/AY2324S2-CS2103T-T08-3_tp_master/authorship.json index 5a39b5fe..0a8413ee 100644 --- a/AY2324S2-CS2103T-T08-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T08-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ZHANGTIANYAO1"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T08-3/tp/graph/badge.svg?token\u003d0RG4SRDBHW)](https://codecov.io/gh/AY2324S2-CS2103T-T08-3/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":"ZHANGTIANYAO1"},"content":"* This is **a project for Computer professional job seekers**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * as a tool to manage job applications","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * as a tool to manage contacts of recruiters and interviewers","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* The project simulates an ongoing software project for a desktop application (called _CareerConnect Bot_) used for managing contact details.","lastModifiedDate":"2024-03-07"},{"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":"ZHANGTIANYAO1"},"content":"* It is named `CareerConnect Bot` (`CCBot` for short), it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2024-03-07"},{"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":"ZHANGTIANYAO1"},"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":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"}],"authorContributionMap":{"ZHANGTIANYAO1":7,"-":10}},{"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":"### 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":"dabzpengu"},"content":"### Mahathir Norrahim","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"dabzpengu"},"content":"\u003cimg src\u003d\"images/gandalf.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"dabzpengu"},"content":"[[github](https://github.com/dabzpengu)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"dabzpengu"},"content":"* Responsibilities: UI / Quality Assurance","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"Lalelulilulela"},"content":"### Tan Yi Jing","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Lalelulilulela"},"content":"\u003cimg src\u003d\"images/lalelulilulela.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Lalelulilulela"},"content":"[[github](http://github.com/Lalelulilulela)] [[portfolio](team/Lalelulilulela.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"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":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"Dexter-Wong"},"content":"### Dexter Wong","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Dexter-Wong"},"content":"\u003cimg src\u003d\"images/dexter.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"Dexter-Wong"},"content":"[[github](http://github.com/Dexter-Wong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"Dexter-Wong"},"content":"[[portfolio](team/dexter.md)]","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":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Lalelulilulela":3,"dabzpengu":4,"-":47,"Dexter-Wong":4}},{"path":"docs/team/dexter.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Dexter-Wong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Dexter-Wong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Dexter-Wong"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Dexter-Wong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Dexter-Wong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Dexter-Wong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Dexter-Wong"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"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":"Dexter-Wong"},"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":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Dexter-Wong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Dexter-Wong"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Dexter-Wong"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Dexter-Wong"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"Dexter-Wong"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Dexter-Wong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Dexter-Wong"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Dexter-Wong"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Dexter-Wong"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Dexter-Wong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"Dexter-Wong"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"Dexter-Wong"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"Dexter-Wong"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"Dexter-Wong"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"Dexter-Wong"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"Dexter-Wong"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"Dexter-Wong"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"Dexter-Wong"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"Dexter-Wong"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Dexter-Wong":46}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ZHANGTIANYAO1"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T08-3/tp/graph/badge.svg?token\u003d0RG4SRDBHW)](https://codecov.io/gh/AY2324S2-CS2103T-T08-3/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":"ZHANGTIANYAO1"},"content":"* This is **a project for Computer professional job seekers**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * as a tool to manage job applications","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"ZHANGTIANYAO1"},"content":" * as a tool to manage contacts of recruiters and interviewers","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"ZHANGTIANYAO1"},"content":"* The project simulates an ongoing software project for a desktop application (called _CareerConnect Bot_) used for managing contact details.","lastModifiedDate":"2024-03-07"},{"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":"ZHANGTIANYAO1"},"content":"* It is named `CareerConnect Bot` (`CCBot` for short), it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2024-03-07"},{"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":"ZHANGTIANYAO1"},"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":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"}],"authorContributionMap":{"ZHANGTIANYAO1":7,"-":10}},{"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":"### 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":"dabzpengu"},"content":"### Mahathir Norrahim","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"dabzpengu"},"content":"\u003cimg src\u003d\"images/gandalf.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"dabzpengu"},"content":"[[github](https://github.com/dabzpengu)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"dabzpengu"},"content":"* Responsibilities: UI / Quality Assurance","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"Lalelulilulela"},"content":"### Tan Yi Jing","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Lalelulilulela"},"content":"\u003cimg src\u003d\"images/lalelulilulela.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Lalelulilulela"},"content":"[[github](http://github.com/Lalelulilulela)] [[portfolio](team/Lalelulilulela.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"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":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"Dexter-Wong"},"content":"### Dexter Wong","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Dexter-Wong"},"content":"\u003cimg src\u003d\"images/dexter.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"Dexter-Wong"},"content":"[[github](http://github.com/Dexter-Wong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"Dexter-Wong"},"content":"[[portfolio](team/dexter.md)]","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":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Lalelulilulela":3,"dabzpengu":4,"-":47,"Dexter-Wong":4}},{"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":"Lalelulilulela"},"content":"* computing professionals looking for job openings","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"Lalelulilulela"},"content":"* has a need to manage a significant number of company contacts","lastModifiedDate":"2024-03-07"},{"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":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"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":285,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"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":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"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":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"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":322,"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":323,"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":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"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: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"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":339,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"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":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"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":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"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":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"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":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"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":373,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","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"}],"authorContributionMap":{"Lalelulilulela":2,"-":381}},{"path":"docs/team/dexter.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Dexter-Wong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"Dexter-Wong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"Dexter-Wong"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"Dexter-Wong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Dexter-Wong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"Dexter-Wong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"Dexter-Wong"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"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":"Dexter-Wong"},"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":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"Dexter-Wong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"Dexter-Wong"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"Dexter-Wong"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"Dexter-Wong"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"Dexter-Wong"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"Dexter-Wong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"Dexter-Wong"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"Dexter-Wong"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"Dexter-Wong"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Dexter-Wong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"Dexter-Wong"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"Dexter-Wong"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"Dexter-Wong"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"Dexter-Wong"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"Dexter-Wong"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"Dexter-Wong"},"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":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"Dexter-Wong"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"Dexter-Wong"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"Dexter-Wong"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"Dexter-Wong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"Dexter-Wong"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"Dexter-Wong":46}}] diff --git a/AY2324S2-CS2103T-T08-3_tp_master/commits.json b/AY2324S2-CS2103T-T08-3_tp_master/commits.json index 89984317..c36742f6 100644 --- a/AY2324S2-CS2103T-T08-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T08-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"ashleyy2444":[],"ZHANGTIANYAO1":[{"date":"2024-03-06","commitResults":[{"hash":"295120da196bbe5379d0c70f80fa8af3afd2c7cf","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"05151230009c43b638afe7b3182051dd8eb71ac4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"2cf4c130f72f3d590b00e232a497511502343e9c","isMergeCommit":false,"messageTitle":"Create zhangtianyao.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":0}}},{"hash":"e900d5dbc2d861fe5271e34cae83b17f0b116485","isMergeCommit":true,"messageTitle":"Merge pull request #1 from ZHANGTIANYAO1/Update-AboutUS","messageBody":"Add personal picture","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"ef77bc29e4846d2a0a26c4eb7d28011dbb39fe06","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"069204c19d96ecb2f2ba7d3e3ea509ed18fb5009","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e7dda709ce0be666792eef5de28150c1cee4778b","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b2fbf41718f013605088a15754c27b9582228ffd","isMergeCommit":false,"messageTitle":"Delete docs/team/zhangtianyao.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":7}}},{"hash":"4706b8c32e71d8a70557e55aaadb495f45a86757","isMergeCommit":false,"messageTitle":"Delete docs/AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":59}}},{"hash":"1f384844312b659758d20d831deed4fce5b0fc93","isMergeCommit":false,"messageTitle":"Create AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":59,"deletions":0}}},{"hash":"0e9e70842512853df00e55f50167748f715ca3f3","isMergeCommit":true,"messageTitle":"Merge pull request #4 from ZHANGTIANYAO1/Update-README","messageBody":"Update readme","fileTypesAndContributionMap":{}},{"hash":"9a944b36aacfc19e2afc23831161532d78b5f836","isMergeCommit":true,"messageTitle":"Merge pull request #5 from dabzpengu/AboutUS","messageBody":"update issue #1","fileTypesAndContributionMap":{}},{"hash":"bc6528d57d550164316ed83df5ba608b44762b76","isMergeCommit":true,"messageTitle":"Merge pull request #6 from Lalelulilulela/branch-updateAboutUs","messageBody":"Update AboutUs.md and create yj.md","fileTypesAndContributionMap":{}},{"hash":"7d43e67f0da1eb15b2868cf9b11e7662db5c78fe","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Dexter-Wong/v1.1","messageBody":"Update the AboutUs.md file and include new images","fileTypesAndContributionMap":{}}]}],"Lalelulilulela":[{"date":"2024-03-07","commitResults":[{"hash":"99756d0e6caba81b51e4d3b22bf0e6d907f68b1f","isMergeCommit":false,"messageTitle":"Update AboutUs.md and create yj.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"8a39da76061a46a912f188c63684ee485c3052a4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"dabzpengu":[{"date":"2024-03-07","commitResults":[{"hash":"3774ffd1bfdb594e3ecdfb78eac63ee708c53440","isMergeCommit":false,"messageTitle":"update issue #1","messageBody":"added role\n","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}}]}],"Dexter-Wong":[{"date":"2024-03-07","commitResults":[{"hash":"d0f941156237f13bb99ba5e0577c2b34ae29d3a9","isMergeCommit":false,"messageTitle":"Update the AboutUs.md file and include new images","messageBody":"The AboutUs.md file allows users to find out more\nabout the developers.\n\nUpdating the AboutUs.md file allows us to delegate\ngroup work more efficiently.\n","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}}]}]},"authorFileTypeContributionMap":{"ashleyy2444":{"docs":0,"functional-code":0,"test-code":0},"ZHANGTIANYAO1":{"docs":7,"functional-code":0,"test-code":0},"Lalelulilulela":{"docs":3,"functional-code":0,"test-code":0},"dabzpengu":{"docs":4,"functional-code":0,"test-code":0},"Dexter-Wong":{"docs":50,"functional-code":0,"test-code":0}},"authorContributionVariance":{"ashleyy2444":0.0,"ZHANGTIANYAO1":1276.5509,"Lalelulilulela":6.6326528,"dabzpengu":5.3724484,"Dexter-Wong":193.40816},"authorDisplayNameMap":{"ashleyy2444":"CS2103T-T08-3 CHUA..HLEY","ZHANGTIANYAO1":"CS2103T-T08-3 ZHAN..NYAO","Lalelulilulela":"CS2103T-T08-3 TAN ..JING","dabzpengu":"CS2103T-T08-3 MUHA..AHIM","Dexter-Wong":"CS2103T-T08-3 DEXT.. YOU"}} +{"authorDailyContributionsMap":{"ashleyy2444":[],"ZHANGTIANYAO1":[{"date":"2024-03-06","commitResults":[{"hash":"295120da196bbe5379d0c70f80fa8af3afd2c7cf","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"05151230009c43b638afe7b3182051dd8eb71ac4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"2cf4c130f72f3d590b00e232a497511502343e9c","isMergeCommit":false,"messageTitle":"Create zhangtianyao.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":0}}},{"hash":"e900d5dbc2d861fe5271e34cae83b17f0b116485","isMergeCommit":true,"messageTitle":"Merge pull request #1 from ZHANGTIANYAO1/Update-AboutUS","messageBody":"Add personal picture","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"ef77bc29e4846d2a0a26c4eb7d28011dbb39fe06","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"069204c19d96ecb2f2ba7d3e3ea509ed18fb5009","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e7dda709ce0be666792eef5de28150c1cee4778b","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b2fbf41718f013605088a15754c27b9582228ffd","isMergeCommit":false,"messageTitle":"Delete docs/team/zhangtianyao.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":7}}},{"hash":"4706b8c32e71d8a70557e55aaadb495f45a86757","isMergeCommit":false,"messageTitle":"Delete docs/AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":59}}},{"hash":"1f384844312b659758d20d831deed4fce5b0fc93","isMergeCommit":false,"messageTitle":"Create AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":59,"deletions":0}}},{"hash":"0e9e70842512853df00e55f50167748f715ca3f3","isMergeCommit":true,"messageTitle":"Merge pull request #4 from ZHANGTIANYAO1/Update-README","messageBody":"Update readme","fileTypesAndContributionMap":{}},{"hash":"9a944b36aacfc19e2afc23831161532d78b5f836","isMergeCommit":true,"messageTitle":"Merge pull request #5 from dabzpengu/AboutUS","messageBody":"update issue #1","fileTypesAndContributionMap":{}},{"hash":"bc6528d57d550164316ed83df5ba608b44762b76","isMergeCommit":true,"messageTitle":"Merge pull request #6 from Lalelulilulela/branch-updateAboutUs","messageBody":"Update AboutUs.md and create yj.md","fileTypesAndContributionMap":{}},{"hash":"7d43e67f0da1eb15b2868cf9b11e7662db5c78fe","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Dexter-Wong/v1.1","messageBody":"Update the AboutUs.md file and include new images","fileTypesAndContributionMap":{}}]}],"Lalelulilulela":[{"date":"2024-03-07","commitResults":[{"hash":"99756d0e6caba81b51e4d3b22bf0e6d907f68b1f","isMergeCommit":false,"messageTitle":"Update AboutUs.md and create yj.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"8a39da76061a46a912f188c63684ee485c3052a4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"6e78db8b9046c709ff04b1a9caa2428480ffbd10","isMergeCommit":false,"messageTitle":"update target user profile in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"0eb8be4b097877bc356e8cc59eb71d6ccf53d0cc","isMergeCommit":false,"messageTitle":"Revert \"update target user profile in DeveloperGuide.md\"","messageBody":"This reverts commit 6e78db8b9046c709ff04b1a9caa2428480ffbd10.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":2}}},{"hash":"a1c368d6ee9a3a371e00adc96dcc650aa1cfd765","isMergeCommit":false,"messageTitle":"Update target user profile in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"dabzpengu":[{"date":"2024-03-07","commitResults":[{"hash":"3774ffd1bfdb594e3ecdfb78eac63ee708c53440","isMergeCommit":false,"messageTitle":"update issue #1","messageBody":"added role\n","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}}]},{"date":"2024-03-08","commitResults":[{"hash":"33c4523a74000f11f1e72630b5908de2caae1ed2","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Lalelulilulela/branch-DG-target-user-profile","messageBody":"Update Target User Profile in DG","fileTypesAndContributionMap":{}}]}],"Dexter-Wong":[{"date":"2024-03-07","commitResults":[{"hash":"d0f941156237f13bb99ba5e0577c2b34ae29d3a9","isMergeCommit":false,"messageTitle":"Update the AboutUs.md file and include new images","messageBody":"The AboutUs.md file allows users to find out more\nabout the developers.\n\nUpdating the AboutUs.md file allows us to delegate\ngroup work more efficiently.\n","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}}]}]},"authorFileTypeContributionMap":{"ashleyy2444":{"docs":0,"functional-code":0,"test-code":0},"ZHANGTIANYAO1":{"docs":7,"functional-code":0,"test-code":0},"Lalelulilulela":{"docs":5,"functional-code":0,"test-code":0},"dabzpengu":{"docs":4,"functional-code":0,"test-code":0},"Dexter-Wong":{"docs":50,"functional-code":0,"test-code":0}},"authorContributionVariance":{"ashleyy2444":0.0,"ZHANGTIANYAO1":1199.1735,"Lalelulilulela":22.462221,"dabzpengu":5.04,"Dexter-Wong":181.44},"authorDisplayNameMap":{"ashleyy2444":"CS2103T-T08-3 CHUA..HLEY","ZHANGTIANYAO1":"CS2103T-T08-3 ZHAN..NYAO","Lalelulilulela":"CS2103T-T08-3 TAN ..JING","dabzpengu":"CS2103T-T08-3 MUHA..AHIM","Dexter-Wong":"CS2103T-T08-3 DEXT.. YOU"}} diff --git a/AY2324S2-CS2103T-T10-2_tp_master/authorship.json b/AY2324S2-CS2103T-T10-2_tp_master/authorship.json index 5c660193..cc636115 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":"-"},"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":"minreiseah"},"content":"### Min Rei","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"minreiseah"},"content":"\u003cimg src\u003d\"images/minreiseah.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"minreiseah"},"content":"[[github](http://github.com/minreiseah)] [[portfolio](team/minrei.md)]","lastModifiedDate":"2024-03-07"},{"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":"minreiseah"},"content":"### Sampson","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"SampsonYe1999"},"content":"\u003cimg src\u003d\"images/sampsonye1999.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"SampsonYe1999"},"content":"[[github](http://github.com/SampsonYe1999)]","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"SampsonYe1999"},"content":"[[portfolio](team/sampsonye.md)]","lastModifiedDate":"2024-03-07"},{"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":"minreiseah"},"content":"### Shuyuan","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"legionlegion"},"content":"\u003cimg src\u003d\"images/legionlegion.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"legionlegion"},"content":"[[github](http://github.com/legionlegion)]","lastModifiedDate":"2024-03-07"},{"lineNumber":59,"author":{"gitId":"legionlegion"},"content":"[[portfolio](team/legionlegion.md)]","lastModifiedDate":"2024-03-07"},{"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":{"legionlegion":3,"minreiseah":10,"-":46,"SampsonYe1999":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":"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}}] diff --git a/AY2324S2-CS2103T-T10-2_tp_master/commits.json b/AY2324S2-CS2103T-T10-2_tp_master/commits.json index 935eec7e..c86d5db0 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":{}}]}],"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":{}}]}],"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":0,"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":0.0,"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":{}}]}],"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"}} diff --git a/AY2324S2-CS2103T-T10-3_tp_master/authorship.json b/AY2324S2-CS2103T-T10-3_tp_master/authorship.json index 69c78db1..fb637efc 100644 --- a/AY2324S2-CS2103T-T10-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T10-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"taeewonnn"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T10-3/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T10-3/tp/graph/badge.svg?token\u003dGBPS86G6DT)](https://codecov.io/gh/AY2324S2-CS2103T-T10-3/tp)","lastModifiedDate":"2024-02-21"},{"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":"taeewonnn"},"content":"### Eventy","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"taeewonnn"},"content":"* This CLI application serves as an address book tailored for event planners in halls, facilitating efficient management of participants and events. This is a CLI application that is desgined for users who type fast\u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"taeewonnn"},"content":"### What does this do","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"taeewonnn"},"content":"* The project is tailored specifically for student event organizers and offers a new standard of convenient and easy event planning.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"taeewonnn"},"content":"* The application is targeted towards users who type fast and are used to CLI application. ","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"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":17,"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":18,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"taeewonnn"},"content":"* It is named `Eventy` (`ET` for short) because we want to insert playfulness and efficiency into event planning. Plus it reminds you of a certain character! doesn\u0027t it :)","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"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":21,"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":22,"author":{"gitId":"taeewonnn"},"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":{"taeewonnn":10,"-":12}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"taeewonnn"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T10-3/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T10-3/tp/graph/badge.svg?token\u003dGBPS86G6DT)](https://codecov.io/gh/AY2324S2-CS2103T-T10-3/tp)","lastModifiedDate":"2024-02-21"},{"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":"taeewonnn"},"content":"### Eventy","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"taeewonnn"},"content":"* This CLI application serves as an address book tailored for event planners in halls, facilitating efficient management of participants and events. This is a CLI application that is desgined for users who type fast\u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"taeewonnn"},"content":"### What does this do","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"taeewonnn"},"content":"* The project is tailored specifically for student event organizers and offers a new standard of convenient and easy event planning.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"taeewonnn"},"content":"* The application is targeted towards users who type fast and are used to CLI application. ","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"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":17,"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":18,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"taeewonnn"},"content":"* It is named `Eventy` (`ET` for short) because we want to insert playfulness and efficiency into event planning. Plus it reminds you of a certain character! doesn\u0027t it :)","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"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":21,"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":22,"author":{"gitId":"taeewonnn"},"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":{"taeewonnn":10,"-":12}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"myang2020"},"content":"We are the developer team of Eventy, an event management app, based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"myang2020"},"content":"## Project Team","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"myang2020"},"content":"### Nigel Lee","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/apzure.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/Apzure)]","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"myang2020"},"content":"- Team Lead, Scheduling and Tracking","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"myang2020"},"content":" - Overall project coordination","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"myang2020"},"content":" - Defining, assigning, and tracking project tasks","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"myang2020"},"content":"### Han Taewon","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/taeewonnn.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/taeewonnn)]","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"myang2020"},"content":"- Documentation, Deliverables and Deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"myang2020"},"content":" - Quality of various project documents","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"myang2020"},"content":" - Timeliness of project deliverables","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"myang2020"},"content":"### Max Yang","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/myang2020.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/myang2020)]","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"myang2020"},"content":"- Testing","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"myang2020"},"content":" - Ensure testing of the project is done properly and on time","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"myang2020"},"content":"### Liu Yifan","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/nusliuyifan.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/nusliuyifan)]","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"myang2020"},"content":"- Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"myang2020"},"content":" - In charge of versioning of the code","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"myang2020"},"content":" - Maintaining the code repository","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"myang2020"},"content":" - Integrating various parts of the software to create a whole","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"myang2020"},"content":"### Yichao Song","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"myang2020"},"content":"\u003cimg src\u003d\"images/chocoragdoll.png\" width\u003d\"180px\" height\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"myang2020"},"content":"[[github](https://github.com/ChocoRagdoll)]","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"myang2020"},"content":"**Roles and Responsibilities:**","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"myang2020"},"content":"- Code Quality","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"myang2020"},"content":" - Ensures adherence to coding standards","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"-":19,"myang2020":36}},{"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":"taeewonnn"},"content":"* Active members of university clubs and societies or school event committees","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"taeewonnn"},"content":"* Tech-savvy and reasonably comfortable with digital tools","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"taeewonnn"},"content":"* Fast typer","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"taeewonnn"},"content":"* Managing multiple events that range from small-scale meetings to large school-wide events","lastModifiedDate":"2024-03-05"},{"lineNumber":281,"author":{"gitId":"taeewonnn"},"content":"* Frequently communicating and coordinating with a variety of contacts including vendors, participants, volunteers, and school administrators","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"taeewonnn"},"content":"* Task driven with a need to balance multiple deadlines and responsibilities simultaneously","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"taeewonnn"},"content":"**Value proposition:**","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"taeewonnn"},"content":"The evolved AB3 contact management application, tailored specifically for student event organizers, offers a new standard of streamlined and automated contact organization. It serves as your single source of truth for storing, managing, and retrieving all contact-related information.","lastModifiedDate":"2024-03-05"},{"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":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":295,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | create a new event | plan and manage all the events that in one place |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | add a new person | manage all my contacts in one place |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | add participant to an event | manage and plan all the participant for a specific event |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | delete a person | remove contacts that I no longer need |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"taeewonnn"},"content":"| `* * *` | user | remove specific participant | remove a specific participant from a specific event |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"taeewonnn"},"content":"| `* *` | diligent user | edit contact information | update contact information whenever necessary |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"taeewonnn"},"content":"| `* *` | user | select a specific event | search events by name without having to manually search |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"taeewonnn"},"content":"--------------------------------------------------------","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"taeewonnn"},"content":"### Creating an Event","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC01 - Create an event**","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"taeewonnn"},"content":"1. User provides the details of an event to be created.","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the details of the event added by the User in the Event List. ","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"taeewonnn"},"content":"1a. Details provided by User are incomplete or invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"taeewonnn"},"content":"1b. Event to be added already exists in Eventy.","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"taeewonnn"},"content":"- 1b1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"taeewonnn"},"content":"### Deleting an event","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"taeewonnn"},"content":"**Use case: UC02 - Delete an event**","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** User has added at least one event.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"taeewonnn"},"content":"A successful deletion deletes an event from the event list.","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"taeewonnn"},"content":"1. Eventy shows a list of events.","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"taeewonnn"},"content":"2. User requests to delete a specific event in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"taeewonnn"},"content":"3. Eventy deletes the event.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"taeewonnn"},"content":"1a. The list is empty. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"taeewonnn"},"content":"2a. Details provided by User are incomplete or invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"taeewonnn"},"content":"- 2a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"taeewonnn"},"content":" *Use case resumes at step 2.*","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"taeewonnn"},"content":"### Adding participants contact to the global list","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"taeewonnn"},"content":"**Use case: UC03 - Add participants contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"taeewonnn"},"content":"A successful addition adds a participant to the global list.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"taeewonnn"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"taeewonnn"},"content":"1. User provides the detail of the contact to be added.","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the details of the contact added by the user. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"taeewonnn"},"content":"*Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"taeewonnn"},"content":"1a. Details provided by User are incomplete or invalid","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"taeewonnn"},"content":"### Deleting participant","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC04 - Delete a participant from the global participant list**","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** ","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"taeewonnn"},"content":"User has added one or more participant to the global participant list.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"taeewonnn"},"content":"A successful deletion deletes the participant from both the global list and all the events he participates in.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"taeewonnn"},"content":"1. User deletes a participant.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the updated global participant list. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"taeewonnn"},"content":"1a. Participant index provided by the User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"taeewonnn"},"content":" *Use case resumes at step 2.*","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"taeewonnn"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"taeewonnn"},"content":"### Removing participants from a specific event","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"taeewonnn"},"content":"**Use case: UC05 - Remove a participant from the specified event**","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** User has added one or more participant to the specified event.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"taeewonnn"},"content":"1. User requests to remove a participant from a certain event.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"taeewonnn"},"content":"2. Eventy remove the participant from the event. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"taeewonnn"},"content":"1a. The event index provided by the User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"taeewonnn"},"content":"1b. Participant index provided by the User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"taeewonnn"},"content":"### Selecting an event","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC06 - Select an event from the event list**","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:** User has added one or more events to the event list.","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"taeewonnn"},"content":"A successful selection displays the event details.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"taeewonnn"},"content":"1. User selects an event.","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the details of the selected event. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"taeewonnn"},"content":"1a. Event index provided by User is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"taeewonnn"},"content":"### Add a participant to an event","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"taeewonnn"},"content":"**Use Case: UC07 - Add a participant to an event**","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"taeewonnn"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"taeewonnn"},"content":"**Preconditions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"taeewonnn"},"content":"User has added one or more contacts to the global contact list.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"taeewonnn"},"content":"**Guarantees:**","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"taeewonnn"},"content":"A successful addition adds a participant from the global list to the selected event.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"taeewonnn"},"content":"**MSS:**","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"taeewonnn"},"content":"1. User inputs the index of participant to be added.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"taeewonnn"},"content":"2. Eventy displays the added participant in the panel showing list of participants in selected event. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":468,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"taeewonnn"},"content":"**Extensions:**","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"taeewonnn"},"content":"1a. Index provided by user is invalid/out of range of global contact list.","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"taeewonnn"},"content":"- 1a1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"taeewonnn"},"content":"1b. Contact to be added already exists in selected event.","lastModifiedDate":"2024-03-07"},{"lineNumber":476,"author":{"gitId":"taeewonnn"},"content":"- 1b1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":477,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":478,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"taeewonnn"},"content":"1b. User does not provide an index.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"taeewonnn"},"content":"- 1b1. Eventy displays an error message to alert the User. \u003c/br\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":481,"author":{"gitId":"taeewonnn"},"content":" *Use case ends*","lastModifiedDate":"2024-03-07"},{"lineNumber":482,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":483,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":484,"author":{"gitId":"taeewonnn"},"content":"### Non-Functional Requirements","lastModifiedDate":"2024-03-07"},{"lineNumber":485,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":486,"author":{"gitId":"taeewonnn"},"content":"1. The user should be able to use the application smoothly with a device running mainstream OS with Java 11 or above installed.","lastModifiedDate":"2024-03-07"},{"lineNumber":487,"author":{"gitId":"taeewonnn"},"content":"2. The application should be able to store up to 1000 participants and 50 events without a reduction in speed.","lastModifiedDate":"2024-03-07"},{"lineNumber":488,"author":{"gitId":"taeewonnn"},"content":"3. A user familiar with CLI applications with a reasonable typing speed should be able to navigate commands faster than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":489,"author":{"gitId":"taeewonnn"},"content":"4. The user interface should be simple, clear, easily understandable and fast to navigate.","lastModifiedDate":"2024-03-07"},{"lineNumber":490,"author":{"gitId":"taeewonnn"},"content":"5. The application should gracefully handle errors by displaying error messages to prevent system crashes and data corruption.","lastModifiedDate":"2024-03-07"},{"lineNumber":491,"author":{"gitId":"taeewonnn"},"content":"6. The application should be released as a free application to the general public.","lastModifiedDate":"2024-03-07"},{"lineNumber":492,"author":{"gitId":"taeewonnn"},"content":"7. The average command response time of Eventy should be less than a second.","lastModifiedDate":"2024-03-07"},{"lineNumber":493,"author":{"gitId":"taeewonnn"},"content":"8. The application should consume no more than 200Mb of memory when holding less than 1000 participants and 50 events.","lastModifiedDate":"2024-03-07"},{"lineNumber":494,"author":{"gitId":"taeewonnn"},"content":"9. The application should launch in less than 5 seconds.","lastModifiedDate":"2024-03-07"},{"lineNumber":495,"author":{"gitId":"taeewonnn"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":496,"author":{"gitId":"taeewonnn"},"content":"### Glossary","lastModifiedDate":"2024-03-07"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"taeewonnn"},"content":"* **Mainstream OS:** Windows, Linux, Unix, OS-X","lastModifiedDate":"2024-03-07"},{"lineNumber":499,"author":{"gitId":"taeewonnn"},"content":"* **Eventy:** Name of the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":500,"author":{"gitId":"taeewonnn"},"content":"* **Global participant list:** List of participants that are saved in the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":501,"author":{"gitId":"taeewonnn"},"content":"* **Event list:** List of events created in the application to be managed.","lastModifiedDate":"2024-03-07"},{"lineNumber":502,"author":{"gitId":"taeewonnn"},"content":"* **Event participant list:** List of participants in the specific event.","lastModifiedDate":"2024-03-07"},{"lineNumber":503,"author":{"gitId":"taeewonnn"},"content":"* **Participant:** The contact whose information is stored in the application storage.","lastModifiedDate":"2024-03-07"},{"lineNumber":504,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":512,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":513,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"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":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"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":528,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"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":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"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":545,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"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":547,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":365,"taeewonnn":192}}] diff --git a/AY2324S2-CS2103T-T10-3_tp_master/commits.json b/AY2324S2-CS2103T-T10-3_tp_master/commits.json index e300904d..9306bc1e 100644 --- a/AY2324S2-CS2103T-T10-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T10-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Apzure":[{"date":"2024-03-01","commitResults":[{"hash":"7cf00ce62f5c66c95e74d5206be3c397635ca505","isMergeCommit":true,"messageTitle":"Merge pull request #9 from taeewonnn/update-README","messageBody":"Update readme","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"bd1eadc4b81baead532e60bcb7fb7e826fccde11","isMergeCommit":true,"messageTitle":"Merge pull request #12 from taeewonnn/update-README","messageBody":"Fix GFMD","fileTypesAndContributionMap":{}}]}],"nusliuyifan":[],"ChocoRagdoll":[],"taeewonnn":[{"date":"2024-02-29","commitResults":[{"hash":"159f028e4b4133b90bd9129ac30d346895c02ce5","isMergeCommit":false,"messageTitle":"Update README","messageBody":"Let\u0027s update README file and upload mock UI image\n","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":3}}}]},{"date":"2024-03-01","commitResults":[{"hash":"8ac632def05a6dabddebfc9f65e0f457b48cfb4b","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-02","commitResults":[{"hash":"35d21a156592acc62436aa9a7d097d6f0a78b4a9","isMergeCommit":false,"messageTitle":"Fix GFMD","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"myang2020":[]},"authorFileTypeContributionMap":{"Apzure":{"docs":0,"functional-code":0,"test-code":0},"nusliuyifan":{"docs":0,"functional-code":0,"test-code":0},"ChocoRagdoll":{"docs":0,"functional-code":0,"test-code":0},"taeewonnn":{"docs":10,"functional-code":0,"test-code":0},"myang2020":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Apzure":0.0,"nusliuyifan":0.0,"ChocoRagdoll":0.0,"taeewonnn":15.290001,"myang2020":0.0},"authorDisplayNameMap":{"Apzure":"CS2103T-T10-3 NIGE..N YI","nusliuyifan":"CS2103T-T10-3 LIU ..IFAN","ChocoRagdoll":"CS2103T-T10-3 SONG..CHAO","taeewonnn":"CS2103T-T10-3 HAN .. WON","myang2020":"CS2103T-T10-3 YANG..X CK"}} +{"authorDailyContributionsMap":{"Apzure":[{"date":"2024-03-01","commitResults":[{"hash":"7cf00ce62f5c66c95e74d5206be3c397635ca505","isMergeCommit":true,"messageTitle":"Merge pull request #9 from taeewonnn/update-README","messageBody":"Update readme","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"bd1eadc4b81baead532e60bcb7fb7e826fccde11","isMergeCommit":true,"messageTitle":"Merge pull request #12 from taeewonnn/update-README","messageBody":"Fix GFMD","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"81dd327a4ce186191fafba4593b5ba6b90f4ea24","isMergeCommit":true,"messageTitle":"Merge pull request #13 from myang2020/AboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"4acc6fc0ccda79e2ee616f944a79a9aa7f8007c0","isMergeCommit":true,"messageTitle":"Merge pull request #18 from taeewonnn/document-DG","messageBody":"Modify DG","fileTypesAndContributionMap":{}}]}],"nusliuyifan":[],"ChocoRagdoll":[],"taeewonnn":[{"date":"2024-02-29","commitResults":[{"hash":"159f028e4b4133b90bd9129ac30d346895c02ce5","isMergeCommit":false,"messageTitle":"Update README","messageBody":"Let\u0027s update README file and upload mock UI image\n","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":3}}}]},{"date":"2024-03-01","commitResults":[{"hash":"8ac632def05a6dabddebfc9f65e0f457b48cfb4b","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-02","commitResults":[{"hash":"35d21a156592acc62436aa9a7d097d6f0a78b4a9","isMergeCommit":false,"messageTitle":"Fix GFMD","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-05","commitResults":[{"hash":"4f605e5315aff61dcf6ffc555e7f94d4bc5b0262","isMergeCommit":false,"messageTitle":"Modify DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":12}}}]},{"date":"2024-03-07","commitResults":[{"hash":"2f796666b1104c7b60071a3e0637dbdffa97618a","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":179,"deletions":22}}}]}],"myang2020":[{"date":"2024-02-29","commitResults":[{"hash":"17f988724f313f112ea30f88ed1b6ed07c9d2368","isMergeCommit":false,"messageTitle":"Add images to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":15}}}]},{"date":"2024-03-03","commitResults":[{"hash":"118e8c6cee2e6e2fe86583a23972c614e14a80a0","isMergeCommit":false,"messageTitle":"Edit AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":9}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d9196a2529d661340ec72c68afba364d5d82dcbb","isMergeCommit":false,"messageTitle":"Fixed roles and responsibilities","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":17}}},{"hash":"110878606fe34bbb2065a897506e34ec8d323258","isMergeCommit":false,"messageTitle":"Fix AboutUs layout","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"250a091f5e9cb32a66b0378bd04f3f0fa48f8441","isMergeCommit":false,"messageTitle":"no message","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":5}}}]},{"date":"2024-03-07","commitResults":[{"hash":"5409793dea670f1e9340414896573a08b3df95ed","isMergeCommit":false,"messageTitle":"Beautify AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":19}}},{"hash":"f40bf1dde86de78da50030293f24a2dc49994772","isMergeCommit":false,"messageTitle":"Finalize AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":33}}},{"hash":"bb9a36868f78633cb42c2c37c208722f27acca40","isMergeCommit":false,"messageTitle":"Fix formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"b2eb78d5ac9c2f731ea2368390351ab506d51076","isMergeCommit":false,"messageTitle":"Fix formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"a51c1c5b4d713a64b1215c1c6f555f39bff5eed1","isMergeCommit":false,"messageTitle":"Fix formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2e38c3dc6ac1551ffd5d3664e1aef35246f6bf94","isMergeCommit":false,"messageTitle":"Fix EOF error","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"Apzure":{"docs":0,"functional-code":0,"test-code":0},"nusliuyifan":{"docs":0,"functional-code":0,"test-code":0},"ChocoRagdoll":{"docs":0,"functional-code":0,"test-code":0},"taeewonnn":{"docs":202,"functional-code":0,"test-code":0},"myang2020":{"docs":36,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Apzure":0.0,"nusliuyifan":0.0,"ChocoRagdoll":0.0,"taeewonnn":2641.49,"myang2020":1158.2653},"authorDisplayNameMap":{"Apzure":"CS2103T-T10-3 NIGE..N YI","nusliuyifan":"CS2103T-T10-3 LIU ..IFAN","ChocoRagdoll":"CS2103T-T10-3 SONG..CHAO","taeewonnn":"CS2103T-T10-3 HAN .. WON","myang2020":"CS2103T-T10-3 YANG..X CK"}} diff --git a/AY2324S2-CS2103T-T11-2_tp_master/authorship.json b/AY2324S2-CS2103T-T11-2_tp_master/authorship.json index 5ccf6b96..a228a021 100644 --- a/AY2324S2-CS2103T-T11-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T11-2_tp_master/authorship.json @@ -1 +1 @@ -[{"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":"Hibeom0929"},"content":"* has a need to manage a significant number of contacts of NUS students, tutors, and professors","lastModifiedDate":"2024-03-07"},{"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":"Hibeom0929"},"content":"**Value proposition**: ","lastModifiedDate":"2024-03-07"},{"lineNumber":272,"author":{"gitId":"Hibeom0929"},"content":"* manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-07"},{"lineNumber":273,"author":{"gitId":"Hibeom0929"},"content":"* allow NUS students to save and search up contacts of students/tutors/instructors and the courses they are in. (e.g. tutorial/lecture groupings)","lastModifiedDate":"2024-03-07"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"LargeCrowd"},"content":"|----------|--------------------------------------------|----------------------------------|-----------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"LargeCrowd"},"content":"| `* * *` | user | add a new tutor | |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"LargeCrowd"},"content":"| `* * *` | user | delete a tutor | remove entries that I no longer need |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"LargeCrowd"},"content":"| `* * *` | user | find a tutor by name | locate details of tutors without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"LargeCrowd"},"content":"| `* * *` | user | find a tutor by course code | locate tutors from a specific module without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"LargeCrowd"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"LargeCrowd"},"content":"| `* *` | user | edit a tutor | change incorrect or new information about a tutor |","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"LargeCrowd"},"content":"| `*` | user with many persons in the address book | sort tutor by name | locate a tutor easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":290,"author":{"gitId":"LargeCrowd"},"content":"| `*` | user | add a tutor to a favourites list | access the details of my most frequently contacted tutors easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"LargeCrowd"},"content":"(For all use cases below, the **System** is the `NUSContacts` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"LargeCrowd"},"content":"**UC1: Add a tutor**","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"LargeCrowd"},"content":"1. User requests to add a tutor","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"LargeCrowd"},"content":"2. User provides the tutor\u0027s details","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"LargeCrowd"},"content":"3. NUSContacts adds the tutor","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"LargeCrowd"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"LargeCrowd"},"content":"* 2a. The tutor already exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"LargeCrowd"},"content":" * 2a1. NUSContacts informs the user of the error.","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"LargeCrowd"},"content":"**UC2: Delete a tutor**","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"LargeCrowd"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"LargeCrowd"},"content":"1. User requests to list tutors","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"LargeCrowd"},"content":"2. NUSContacts shows a list of tutors","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"LargeCrowd"},"content":"3. User requests to delete a specific tutor in the list","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"LargeCrowd"},"content":"4. NUSContacts deletes the tutor","lastModifiedDate":"2024-03-07"},{"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":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"LargeCrowd"},"content":" * 3a1. NUSContacts shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"LargeCrowd"},"content":"**UC3: Find a tutor by name**","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"LargeCrowd"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"LargeCrowd"},"content":"1. User requests to find a tutor","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"LargeCrowd"},"content":"2. NUSContacts prompts search criterion (name or course code)","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"LargeCrowd"},"content":"3. User provides the search criterion (name)","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"LargeCrowd"},"content":"4. NUSContacts shows the tutor(s) that match the criterion","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"LargeCrowd"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"LargeCrowd"},"content":"* 4a. No tutor matches the criterion.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"LargeCrowd"},"content":" * 4a1. NUSContacts informs the user of the error.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"LargeCrowd"},"content":"**UC4: Find a tutor by course code**","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"LargeCrowd"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"LargeCrowd"},"content":"1. User requests to find a tutor","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"LargeCrowd"},"content":"2. NUSContacts prompts search criterion (name or course code)","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"LargeCrowd"},"content":"3. User provides the search criterion (course code)","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"LargeCrowd"},"content":"4. NUSContacts shows the tutor(s) that match the criterion","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"LargeCrowd"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"LargeCrowd"},"content":"* 4a. No tutor matches the criterion.","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"LargeCrowd"},"content":" * 4a1. NUSContacts informs the user of the error.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"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":379,"author":{"gitId":"ChillinRage"},"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":380,"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":381,"author":{"gitId":"ChillinRage"},"content":"4. Error messages displayed to application window should be easily understood by most users.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"ChillinRage"},"content":"5. System should respond to user actions within 1 second.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"ChillinRage"},"content":"6. For databases with less than 1000 contacts, fetching and saving of contacts to/from it should not exceed 200 milliseconds.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"ChillinRage"},"content":"7. System should handle data corruption or loss without crashing the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"ChillinRage"},"content":"8. System architecture should support future updates and extensions without major restructures.","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"ChillinRage"},"content":"9. System should support comprehensive testing for all components and features.","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":393,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"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":402,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"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":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"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":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"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":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"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":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"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":436,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"LargeCrowd":69,"Hibeom0929":4,"-":366,"ChillinRage":7}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T11-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T11-2/tp/actions)","lastModifiedDate":"2024-02-21"},{"lineNumber":2,"author":{"gitId":"E0735389"},"content":"[![CodeCov Status](https://codecov.io/gh/AY2324S2-CS2103T-T11-2/tp/branch/master/graph/badge.svg)](https://app.codecov.io/gh/AY2324S2-CS2103T-T11-2/tp)","lastModifiedDate":"2024-03-07"},{"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":"reetmitra"},"content":"# NUSContacts","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"reetmitra"},"content":"NUSContacts is a desktop application for students to manage their contacts, specifically Tutors (Professors and Teaching Assistants) and course coordinators. It is 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, NUSContacts can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"E0735389"},"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":11,"author":{"gitId":"E0735389"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"reetmitra"},"content":"## Features","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"reetmitra"},"content":"### Adding a New Person","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"reetmitra"},"content":"You can add a new person to the address book with their email. The command format is as follows:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"reetmitra"},"content":"add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]...","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"reetmitra"},"content":"### Listing All People","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"reetmitra"},"content":"You can list all the people in the address book. The command format is as follows:","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"reetmitra"},"content":"list","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"reetmitra"},"content":"### Locating Someone by Name or Module Code","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"reetmitra"},"content":"You can locate someone by their name or module code. The command format is as follows:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"reetmitra"},"content":"find KEYWORD [MORE_KEYWORDS]","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"reetmitra"},"content":"### Deleting a Person","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"reetmitra"},"content":"You can delete a person from the address book. The command format is as follows:","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"reetmitra"},"content":"delete PERSON_IDENTIFIER","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"reetmitra"},"content":"### Clearing All Entries","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"reetmitra"},"content":"You can clear all entries from the address book. The command format is as follows:","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"reetmitra"},"content":"clear","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"reetmitra"},"content":"### Exiting the Program","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"reetmitra"},"content":"You can exit the program. The command format is as follows:","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"reetmitra"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":58,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":59,"author":{"gitId":"reetmitra"},"content":"exit","lastModifiedDate":"2024-03-07"},{"lineNumber":60,"author":{"gitId":"reetmitra"},"content":"```","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"E0735389":3,"reetmitra":53,"-":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":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","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":"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":"reetmitra"},"content":"## CS2103T T11-2 Team Members","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"reetmitra"},"content":"### Reet Mitra","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"reetmitra"},"content":"\u003cimg src\u003d\"images/reetmitra.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"reetmitra"},"content":"[[Github](https://github.com/reetmitra)]","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"reetmitra"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"reetmitra"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"reetmitra"},"content":"### Bui Hong Duc","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"reetmitra"},"content":"\u003cimg src\u003d\"images/e0735389.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"reetmitra"},"content":"[[Github](https://github.com/E0735389)]","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"reetmitra"},"content":"* Role: Team Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"reetmitra"},"content":"### Chong Chan How","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"reetmitra"},"content":"\u003cimg src\u003d\"images/chillinrage.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"reetmitra"},"content":"[[Github](https://github.com/ChillinRage)]","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"reetmitra"},"content":"### Timothy Soh Yee Song","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"reetmitra"},"content":"\u003cimg src\u003d\"images/largecrowd.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"reetmitra"},"content":"[[Github](https://github.com/LargeCrowd)]","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"E0735389"},"content":"### Yang Heebeom","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"reetmitra"},"content":"\u003cimg src\u003d\"images/hibeom0929.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"reetmitra"},"content":"[[Github](https://github.com/Hibeom0929)]","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"reetmitra"},"content":"* Responsibilities: Deliverables and Deadlines ","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"E0735389":1,"reetmitra":19,"-":33}},{"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":"Hibeom0929"},"content":"* has a need to manage a significant number of contacts of NUS students, tutors, and professors","lastModifiedDate":"2024-03-07"},{"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":"Hibeom0929"},"content":"**Value proposition**: ","lastModifiedDate":"2024-03-07"},{"lineNumber":272,"author":{"gitId":"Hibeom0929"},"content":"* manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-07"},{"lineNumber":273,"author":{"gitId":"Hibeom0929"},"content":"* allow NUS students to save and search up contacts of students/tutors/instructors and the courses they are in. (e.g. tutorial/lecture groupings)","lastModifiedDate":"2024-03-07"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"LargeCrowd"},"content":"|----------|--------------------------------------------|----------------------------------|-----------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"LargeCrowd"},"content":"| `* * *` | user | add a new tutor | |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"LargeCrowd"},"content":"| `* * *` | user | delete a tutor | remove entries that I no longer need |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"LargeCrowd"},"content":"| `* * *` | user | find a tutor by name | locate details of tutors without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"LargeCrowd"},"content":"| `* * *` | user | find a tutor by course code | locate tutors from a specific module without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"LargeCrowd"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"LargeCrowd"},"content":"| `* *` | user | edit a tutor | change incorrect or new information about a tutor |","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"LargeCrowd"},"content":"| `*` | user with many persons in the address book | sort tutor by name | locate a tutor easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":290,"author":{"gitId":"LargeCrowd"},"content":"| `*` | user | add a tutor to a favourites list | access the details of my most frequently contacted tutors easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"LargeCrowd"},"content":"(For all use cases below, the **System** is the `NUSContacts` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"LargeCrowd"},"content":"**UC1: Add a tutor**","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"LargeCrowd"},"content":"1. User requests to add a tutor","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"LargeCrowd"},"content":"2. User provides the tutor\u0027s details","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"LargeCrowd"},"content":"3. NUSContacts adds the tutor","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"LargeCrowd"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"LargeCrowd"},"content":"* 2a. The tutor already exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"LargeCrowd"},"content":" * 2a1. NUSContacts informs the user of the error.","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"LargeCrowd"},"content":"**UC2: Delete a tutor**","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"LargeCrowd"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"LargeCrowd"},"content":"1. User requests to list tutors","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"LargeCrowd"},"content":"2. NUSContacts shows a list of tutors","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"LargeCrowd"},"content":"3. User requests to delete a specific tutor in the list","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"LargeCrowd"},"content":"4. NUSContacts deletes the tutor","lastModifiedDate":"2024-03-07"},{"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":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"LargeCrowd"},"content":" * 3a1. NUSContacts shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"LargeCrowd"},"content":"**UC3: Find a tutor by name**","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"LargeCrowd"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"LargeCrowd"},"content":"1. User requests to find a tutor","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"LargeCrowd"},"content":"2. NUSContacts prompts search criterion (name or course code)","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"LargeCrowd"},"content":"3. User provides the search criterion (name)","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"LargeCrowd"},"content":"4. NUSContacts shows the tutor(s) that match the criterion","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"LargeCrowd"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"LargeCrowd"},"content":"* 4a. No tutor matches the criterion.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"LargeCrowd"},"content":" * 4a1. NUSContacts informs the user of the error.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"LargeCrowd"},"content":"**UC4: Find a tutor by course code**","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"LargeCrowd"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"LargeCrowd"},"content":"1. User requests to find a tutor","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"LargeCrowd"},"content":"2. NUSContacts prompts search criterion (name or course code)","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"LargeCrowd"},"content":"3. User provides the search criterion (course code)","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"LargeCrowd"},"content":"4. NUSContacts shows the tutor(s) that match the criterion","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"LargeCrowd"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"LargeCrowd"},"content":"* 4a. No tutor matches the criterion.","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"LargeCrowd"},"content":" * 4a1. NUSContacts informs the user of the error.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"LargeCrowd"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"LargeCrowd"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"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":379,"author":{"gitId":"ChillinRage"},"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":380,"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":381,"author":{"gitId":"ChillinRage"},"content":"4. Error messages displayed to application window should be easily understood by most users.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"ChillinRage"},"content":"5. System should respond to user actions within 1 second.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"ChillinRage"},"content":"6. For databases with less than 1000 contacts, fetching and saving of contacts to/from it should not exceed 200 milliseconds.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"ChillinRage"},"content":"7. System should handle data corruption or loss without crashing the application.","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"ChillinRage"},"content":"8. System architecture should support future updates and extensions without major restructures.","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"ChillinRage"},"content":"9. System should support comprehensive testing for all components and features.","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":393,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"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":402,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"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":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"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":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"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":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"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":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"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":436,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"LargeCrowd":69,"Hibeom0929":4,"-":366,"ChillinRage":7}},{"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":"E0735389"},"content":"NUSContacts 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, NUSContacts can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-07"},{"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":"E0735389"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/AY2324S2-CS2103T-T11-2/tp/releases).","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"E0735389"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your NUSContacts application.","lastModifiedDate":"2024-03-07"},{"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":"-"},"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":"E0735389"},"content":"NUSContacts 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-07"},{"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":"E0735389"},"content":"NUSContacts 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-07"},{"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":"E0735389"},"content":"If your changes to the data file makes its format invalid, NUSContacts 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-07"},{"lineNumber":166,"author":{"gitId":"E0735389"},"content":"Furthermore, certain edits can cause the NUSContacts 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-07"},{"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":"E0735389"},"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 NUSContacts home folder.","lastModifiedDate":"2024-03-07"},{"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":{"E0735389":8,"-":190}},{"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":"E0735389"},"content":"title: NUSContacts","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":"E0735389"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T11-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T11-2/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"E0735389"},"content":"[![CodeCov Status](https://codecov.io/gh/AY2324S2-CS2103T-T11-2/tp/branch/master/graph/badge.svg)](https://app.codecov.io/gh/AY2324S2-CS2103T-T11-2/tp)","lastModifiedDate":"2024-03-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":"E0735389"},"content":"**NUSContacts 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":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"E0735389"},"content":"* If you are interested in using NUSContacts, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"E0735389"},"content":"* If you are interested about developing NUSContacts, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"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":{"E0735389":6,"-":13}}] diff --git a/AY2324S2-CS2103T-T11-2_tp_master/commits.json b/AY2324S2-CS2103T-T11-2_tp_master/commits.json index e5578064..1b86cac6 100644 --- a/AY2324S2-CS2103T-T11-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T11-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"LargeCrowd":[{"date":"2024-03-07","commitResults":[{"hash":"78f0e6517babc94f40af97c948c5612eb5b10115","isMergeCommit":false,"messageTitle":"Update User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":8}}},{"hash":"d3e076dfad43eeb7206632fb98de2f690de32781","isMergeCommit":false,"messageTitle":"Update Use Cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":7}}},{"hash":"faef8d909490981c9a28374a026a6c77a2a37ee7","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":12}}}]}],"Hibeom0929":[{"date":"2024-03-07","commitResults":[{"hash":"6789c64d3d22c6f2c260e7e0cf94d96ecfb36c22","isMergeCommit":false,"messageTitle":"Update DG target profile and value proposition","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}}]}],"E0735389":[{"date":"2024-03-07","commitResults":[{"hash":"ff49101c91daade683692b9afd09a79bcd5ab1f7","isMergeCommit":true,"messageTitle":"Merge pull request #12 from LargeCrowd/update-dg","messageBody":"Update DG (User Stories, Use Cases)","fileTypesAndContributionMap":{}},{"hash":"230176e548a5e8bcba1fbc79d778d04f072a33e7","isMergeCommit":true,"messageTitle":"Merge pull request #14 from ChillinRage/update-dg-nfr","messageBody":"Update DG non-functional requirements","fileTypesAndContributionMap":{}},{"hash":"80e8b7ca1b270cd0e535da19b106689053e71b7b","isMergeCommit":true,"messageTitle":"Merge pull request #15 from Hibeom0929/update-dg","messageBody":"Update DG target profile and value proposition","fileTypesAndContributionMap":{}}]}],"reetmitra":[],"ChillinRage":[{"date":"2024-03-07","commitResults":[{"hash":"358b6d4eaef20d125df48773d8f1b3ed3bb5dc88","isMergeCommit":false,"messageTitle":"Add points to non-functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":1}}},{"hash":"cd82ed1e5bc7f37247ec750ecc5915bf9d4ceb40","isMergeCommit":false,"messageTitle":"Update DG non-functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}]},"authorFileTypeContributionMap":{"LargeCrowd":{"docs":69,"functional-code":0,"test-code":0},"Hibeom0929":{"docs":4,"functional-code":0,"test-code":0},"E0735389":{"docs":0,"functional-code":0,"test-code":0},"reetmitra":{"docs":0,"functional-code":0,"test-code":0},"ChillinRage":{"docs":7,"functional-code":0,"test-code":0}},"authorContributionVariance":{"LargeCrowd":802.5511,"Hibeom0929":2.3877552,"E0735389":0.0,"reetmitra":0.0,"ChillinRage":9.551021},"authorDisplayNameMap":{"LargeCrowd":"CS2103T-T11-2 TIMO..SONG","Hibeom0929":"CS2103T-T11-2 YANG..BEOM","E0735389":"CS2103T-T11-2 BUI .. DUC","reetmitra":"CS2103T-T11-2 MITR..REET","ChillinRage":"CS2103T-T11-2 CHON.. HOW"}} +{"authorDailyContributionsMap":{"LargeCrowd":[{"date":"2024-03-07","commitResults":[{"hash":"78f0e6517babc94f40af97c948c5612eb5b10115","isMergeCommit":false,"messageTitle":"Update User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":8}}},{"hash":"d3e076dfad43eeb7206632fb98de2f690de32781","isMergeCommit":false,"messageTitle":"Update Use Cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":7}}},{"hash":"faef8d909490981c9a28374a026a6c77a2a37ee7","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":12}}}]}],"Hibeom0929":[{"date":"2024-03-07","commitResults":[{"hash":"6789c64d3d22c6f2c260e7e0cf94d96ecfb36c22","isMergeCommit":false,"messageTitle":"Update DG target profile and value proposition","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}}]}],"E0735389":[{"date":"2024-03-07","commitResults":[{"hash":"ff49101c91daade683692b9afd09a79bcd5ab1f7","isMergeCommit":true,"messageTitle":"Merge pull request #12 from LargeCrowd/update-dg","messageBody":"Update DG (User Stories, Use Cases)","fileTypesAndContributionMap":{}},{"hash":"230176e548a5e8bcba1fbc79d778d04f072a33e7","isMergeCommit":true,"messageTitle":"Merge pull request #14 from ChillinRage/update-dg-nfr","messageBody":"Update DG non-functional requirements","fileTypesAndContributionMap":{}},{"hash":"80e8b7ca1b270cd0e535da19b106689053e71b7b","isMergeCommit":true,"messageTitle":"Merge pull request #15 from Hibeom0929/update-dg","messageBody":"Update DG target profile and value proposition","fileTypesAndContributionMap":{}},{"hash":"ef7dc353d21acfc218290219209305b4b28e6d47","isMergeCommit":false,"messageTitle":"Fix a typo in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d0d498f2638791fb4e22831c55d06c9d1647bb42","isMergeCommit":false,"messageTitle":"Restore Jekyll front matter","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"2df6d1cdebab940bde7031313147f927fd9ffc6e","isMergeCommit":false,"messageTitle":"Add acknowledgement of AB3 to README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"eface06c98e99218e6cfe4c11bbe12c29ead1081","isMergeCommit":true,"messageTitle":"Merge pull request #17 from E0735389/update-aboutus-and-readme","messageBody":"Update AboutUs and README","fileTypesAndContributionMap":{}},{"hash":"3a2b3956d4b71dc2dac2cd6c4358eb8fb9c6686e","isMergeCommit":true,"messageTitle":"Merge pull request #18 from E0735389/update-jekyll-config","messageBody":"Update Jekyll configuration","fileTypesAndContributionMap":{}},{"hash":"76f3793381e46d17c14e9485181e61df737494a9","isMergeCommit":false,"messageTitle":"Update UserGuide partially to change program name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}},{"hash":"47b67ce8c8cc2b0f9f060f585f22980b5348b3fb","isMergeCommit":false,"messageTitle":"Update website homepage","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"eb051928decbd958f1074499d80e95c85fcbf8da","isMergeCommit":true,"messageTitle":"Merge pull request #19 from E0735389/update-website","messageBody":"Update website","fileTypesAndContributionMap":{}},{"hash":"0b590f2d21f16c972e7258c39f33031127ac79c5","isMergeCommit":false,"messageTitle":"Update the CodeCov and Java CI badges","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-08","commitResults":[{"hash":"5cd62d69f993c2ae4afe13456a2f9ee9dd1fbe10","isMergeCommit":true,"messageTitle":"Merge pull request #20 from E0735389/update-badges","messageBody":"Update the CodeCov and Java CI badges","fileTypesAndContributionMap":{}}]}],"reetmitra":[{"date":"2024-03-07","commitResults":[{"hash":"779314b5f3873060e1bdf113d45ea6e77e46395a","isMergeCommit":false,"messageTitle":"Update \u0027About Us\u0027 page with new team member profiles and photos","messageBody":"- Add profiles for the new team members, including their roles and\n github links.\n- Update existing team member profiles with current project roles and\n recent achievements.\n- Replace outdated team photos with recent ones.\n","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":28}}},{"hash":"b9cc98a6c1949211a1d1b255817be078815fb514","isMergeCommit":false,"messageTitle":"Update README with UI screenshot and project-specific contents","messageBody":"- Add a new screenshot of the project\u0027s UI to give newcomers a visual\n introduction to our interface. This should help in providing a\n clearer idea of what to expect before diving into the details or\n installation process.\n\n- Update all sections of the README to align with our project\u0027s\n specific features, usage instructions, and contribution guidelines.\n This ensures that the documentation is not only up-to-date but also\n relevant to our project\u0027s current version.\n\n- Revise the installation and setup instructions to reflect any recent\n changes in the process, ensure that users can get up and running\n with minimal confusion.\n","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":10}}}]}],"ChillinRage":[{"date":"2024-03-07","commitResults":[{"hash":"358b6d4eaef20d125df48773d8f1b3ed3bb5dc88","isMergeCommit":false,"messageTitle":"Add points to non-functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":1}}},{"hash":"cd82ed1e5bc7f37247ec750ecc5915bf9d4ceb40","isMergeCommit":false,"messageTitle":"Update DG non-functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}]},"authorFileTypeContributionMap":{"LargeCrowd":{"docs":69,"functional-code":0,"test-code":0},"Hibeom0929":{"docs":4,"functional-code":0,"test-code":0},"E0735389":{"docs":18,"functional-code":0,"test-code":0},"reetmitra":{"docs":72,"functional-code":0,"test-code":0},"ChillinRage":{"docs":7,"functional-code":0,"test-code":0}},"authorContributionVariance":{"LargeCrowd":752.8888,"Hibeom0929":2.24,"E0735389":80.64,"reetmitra":766.63995,"ChillinRage":8.96},"authorDisplayNameMap":{"LargeCrowd":"CS2103T-T11-2 TIMO..SONG","Hibeom0929":"CS2103T-T11-2 YANG..BEOM","E0735389":"CS2103T-T11-2 BUI .. DUC","reetmitra":"CS2103T-T11-2 MITR..REET","ChillinRage":"CS2103T-T11-2 CHON.. HOW"}} diff --git a/AY2324S2-CS2103T-T12-2_tp_master/authorship.json b/AY2324S2-CS2103T-T12-2_tp_master/authorship.json index d312244b..195b339c 100644 --- a/AY2324S2-CS2103T-T12-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T12-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":"-"},"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":"smolegz"},"content":"We are a group of Computer Science students undertaking CS2103T.","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"smolegz"},"content":"LookMeUp is an address book application that allows students to seamlessly save contacts of their peers in school. The team hopes that","lastModifiedDate":"2024-03-03"},{"lineNumber":12,"author":{"gitId":"smolegz"},"content":"this product will serve student better convenience in connecting with their friends!","lastModifiedDate":"2024-03-03"},{"lineNumber":13,"author":{"gitId":"smolegz"},"content":"For more enquiries, you can reach us at the email:","lastModifiedDate":"2024-03-03"},{"lineNumber":14,"author":{"gitId":"smolegz"},"content":"1. Koo Zhuo Hui `e0959005@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"smolegz"},"content":"2. Kervyn Tan `e0941855@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":16,"author":{"gitId":"smolegz"},"content":"3. Lynnette Ong Xin Hui `e0968030@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"smolegz"},"content":"4. Aiden Lee Yuan Ting `aidenlyt@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":18,"author":{"gitId":"smolegz"},"content":"5. Chen Runjia `runjia@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"smolegz"},"content":"## Project Team","lastModifiedDate":"2024-03-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"smolegz"},"content":"### Zhuo Hui Koo (Ivan)","lastModifiedDate":"2024-03-03"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/smolegz.png\" width\u003d\"200px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/smolegz)]","lastModifiedDate":"2024-03-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"smolegz"},"content":"Y2 CS student. My hobby is to drink w/ my besties; I am always the “take care of other ppl” 😊","lastModifiedDate":"2024-03-03"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"smolegz"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-03"},{"lineNumber":31,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-03"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"smolegz"},"content":"### Kervyn Tan","lastModifiedDate":"2024-03-03"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/kervyntan.png\" width\u003d\"200px\" height\u003d\"240px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/kervyntan)]","lastModifiedDate":"2024-03-03"},{"lineNumber":38,"author":{"gitId":"smolegz"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":39,"author":{"gitId":"smolegz"},"content":"Y2, CS Major.","lastModifiedDate":"2024-03-03"},{"lineNumber":40,"author":{"gitId":"smolegz"},"content":"Love cycling on the weekends and playing LoL when I have time (basically never)","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"smolegz"},"content":"* Role: Developer","lastModifiedDate":"2024-03-03"},{"lineNumber":43,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"smolegz"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":45,"author":{"gitId":"smolegz"},"content":"### Lynnette Ong","lastModifiedDate":"2024-03-03"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/lynnetteeee.png\" width\u003d\"200px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/lynnetteeee)]","lastModifiedDate":"2024-03-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":51,"author":{"gitId":"smolegz"},"content":"Y2, CS, I love to travel (esp cold weather) and play squash!","lastModifiedDate":"2024-03-03"},{"lineNumber":52,"author":{"gitId":"smolegz"},"content":"I think coding without a deadline is \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e ! Lowkey therapeutic... but once theres deadline... \u003e.\u003c","lastModifiedDate":"2024-03-03"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-03-03"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"smolegz"},"content":"### Aiden Lee","lastModifiedDate":"2024-03-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/aidenlyt.png\" width\u003d\"200px\" height\u003d\"240px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/aidenlyt)]","lastModifiedDate":"2024-03-03"},{"lineNumber":62,"author":{"gitId":"smolegz"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":63,"author":{"gitId":"smolegz"},"content":"Year 2 CS student. I eat ice cream with chopsticks.","lastModifiedDate":"2024-03-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Scheduling \u0026 Tracking","lastModifiedDate":"2024-03-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"smolegz"},"content":"### RunJia Chen","lastModifiedDate":"2024-03-03"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/runjiachen.png\" width\u003d\"200px\" height\u003d\"240px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/RunjiaChen)]","lastModifiedDate":"2024-03-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":74,"author":{"gitId":"smolegz"},"content":"Y1 CS, like to watch Marvel shows like Loki, What if","lastModifiedDate":"2024-03-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"smolegz":42,"-":35}},{"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":"kervyntan"},"content":"NUS students who stay on campus","lastModifiedDate":"2024-03-06"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"kervyntan"},"content":"## User Stories","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"kervyntan"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"kervyntan"},"content":"1. Keeps track of the location and details of upcoming meetings specific to each contact, knowing when and who to make calls with","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"kervyntan"},"content":"2. Given how students who stay on campus find themselves in many different committees and interest groups, our Address Book seeks to provide features that allows them to compartmentalise their contacts and access various groups easily","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":290,"author":{"gitId":"kervyntan"},"content":"| `* * *` | Student in a lot of committees | Access my contacts by groups | Easily identify the people in their different committees and CCAs |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"kervyntan"},"content":"| `* * *` | Student | Sort the contacts alphabetically | Easily navigate the address book |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"kervyntan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"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":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"AidenLYT"},"content":"**Use case:** UC1 - Add a contact\\","lastModifiedDate":"2024-03-01"},{"lineNumber":301,"author":{"gitId":"AidenLYT"},"content":"**Actor:** User\\","lastModifiedDate":"2024-03-01"},{"lineNumber":302,"author":{"gitId":"AidenLYT"},"content":"**Person that can play this role:** Student in a lot of committees","lastModifiedDate":"2024-03-01"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"AidenLYT"},"content":"1. User type add contact command.","lastModifiedDate":"2024-03-01"},{"lineNumber":307,"author":{"gitId":"AidenLYT"},"content":"2. LookMeUp prompts for details.","lastModifiedDate":"2024-03-01"},{"lineNumber":308,"author":{"gitId":"AidenLYT"},"content":"3. User enters the requested details.","lastModifiedDate":"2024-03-01"},{"lineNumber":309,"author":{"gitId":"AidenLYT"},"content":"4. LookMeUp add the contact and displays the new contact in the database.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":310,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-01"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-01"},{"lineNumber":313,"author":{"gitId":"AidenLYT"},"content":"* 1a. User typed an invalid command","lastModifiedDate":"2024-03-01"},{"lineNumber":314,"author":{"gitId":"AidenLYT"},"content":" * 1a1. LookMeUp displays the error and shows a list of commands it supports.","lastModifiedDate":"2024-03-01"},{"lineNumber":315,"author":{"gitId":"AidenLYT"},"content":" * 1a2. User enters the correct command.","lastModifiedDate":"2024-03-01"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":317,"author":{"gitId":"AidenLYT"},"content":" Steps 1a1-1a2 are repeated until the command entered is correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":318,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":320,"author":{"gitId":"AidenLYT"},"content":"* 3a. LookMeUp detects an error in the entered data.","lastModifiedDate":"2024-03-01"},{"lineNumber":321,"author":{"gitId":"AidenLYT"},"content":" * 3a1. LookMeUp displays the error and requests for the correct data.","lastModifiedDate":"2024-03-01"},{"lineNumber":322,"author":{"gitId":"AidenLYT"},"content":" * 3a2. User enters the new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":323,"author":{"gitId":"AidenLYT"},"content":" ","lastModifiedDate":"2024-03-01"},{"lineNumber":324,"author":{"gitId":"AidenLYT"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":325,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-01"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":327,"author":{"gitId":"AidenLYT"},"content":"**Use case:** UC2 - Remove a contact\\","lastModifiedDate":"2024-03-01"},{"lineNumber":328,"author":{"gitId":"AidenLYT"},"content":"**Actor:** User\\","lastModifiedDate":"2024-03-01"},{"lineNumber":329,"author":{"gitId":"AidenLYT"},"content":"**Person that can play this role:** Student in a lot of committees","lastModifiedDate":"2024-03-01"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"AidenLYT"},"content":"**MSS**","lastModifiedDate":"2024-03-01"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":333,"author":{"gitId":"AidenLYT"},"content":"1. User type remove contact command ","lastModifiedDate":"2024-03-01"},{"lineNumber":334,"author":{"gitId":"AidenLYT"},"content":"2. LookMeUp prompts for details ","lastModifiedDate":"2024-03-01"},{"lineNumber":335,"author":{"gitId":"AidenLYT"},"content":"3. User enters the requested details ","lastModifiedDate":"2024-03-01"},{"lineNumber":336,"author":{"gitId":"AidenLYT"},"content":"4. LookMeUp requests for confirmation. ","lastModifiedDate":"2024-03-01"},{"lineNumber":337,"author":{"gitId":"AidenLYT"},"content":"5. LookMeUp removes the contact and displays an execution success message.\\","lastModifiedDate":"2024-03-01"},{"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":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":341,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"AidenLYT"},"content":"* 1a. User typed an invalid command","lastModifiedDate":"2024-03-01"},{"lineNumber":343,"author":{"gitId":"AidenLYT"},"content":" * 1a1. LookMeUp displays the error and shows a list of commands it supports.","lastModifiedDate":"2024-03-01"},{"lineNumber":344,"author":{"gitId":"AidenLYT"},"content":" * 1a2. User enters the correct command.","lastModifiedDate":"2024-03-01"},{"lineNumber":345,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":346,"author":{"gitId":"AidenLYT"},"content":" Steps 1a1-1a2 are repeated until the command entered is correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":347,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":348,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":349,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":350,"author":{"gitId":"AidenLYT"},"content":"* 3a. LookMeUp detects an error in the entered data.","lastModifiedDate":"2024-03-01"},{"lineNumber":351,"author":{"gitId":"AidenLYT"},"content":" * 3a1. LookMeUp displays the error and requests for the correct data.","lastModifiedDate":"2024-03-01"},{"lineNumber":352,"author":{"gitId":"AidenLYT"},"content":" * 3a2. User enters the new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":353,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":354,"author":{"gitId":"AidenLYT"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":355,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-01"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"AidenLYT"},"content":"* 4a. User declines the removal of contact.","lastModifiedDate":"2024-03-01"},{"lineNumber":359,"author":{"gitId":"AidenLYT"},"content":" * 4a1, LookMeUp confirms user\u0027s selection.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":360,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"AidenLYT"},"content":"**Use case:** UC3 - Filter contacts by tags\\","lastModifiedDate":"2024-03-01"},{"lineNumber":363,"author":{"gitId":"AidenLYT"},"content":"**Actor:** User\\","lastModifiedDate":"2024-03-01"},{"lineNumber":364,"author":{"gitId":"AidenLYT"},"content":"**Person that can play this role:** Student in a lot of committees","lastModifiedDate":"2024-03-01"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"AidenLYT"},"content":"**MSS**","lastModifiedDate":"2024-03-01"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"AidenLYT"},"content":"1. User type filter contacts command ","lastModifiedDate":"2024-03-01"},{"lineNumber":369,"author":{"gitId":"AidenLYT"},"content":"2. LookMeUp displays the contact in the database\\","lastModifiedDate":"2024-03-01"},{"lineNumber":370,"author":{"gitId":"AidenLYT"},"content":"Use case ends.","lastModifiedDate":"2024-03-01"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"AidenLYT"},"content":"**Extensions**","lastModifiedDate":"2024-03-01"},{"lineNumber":373,"author":{"gitId":"AidenLYT"},"content":"* 1a. User typed an invalid command","lastModifiedDate":"2024-03-01"},{"lineNumber":374,"author":{"gitId":"AidenLYT"},"content":" * 1a1. LookMeUp displays the error and shows a list of commands it supports.","lastModifiedDate":"2024-03-01"},{"lineNumber":375,"author":{"gitId":"AidenLYT"},"content":" * 1a2. User enters the correct command.","lastModifiedDate":"2024-03-01"},{"lineNumber":376,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":377,"author":{"gitId":"AidenLYT"},"content":" Steps 1a1-1a2 are repeated until the command entered is correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":378,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":379,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":380,"author":{"gitId":"AidenLYT"},"content":"**Use case:** UC4 - Sort contacts by tags\\","lastModifiedDate":"2024-03-01"},{"lineNumber":381,"author":{"gitId":"AidenLYT"},"content":"**Actor:** User\\","lastModifiedDate":"2024-03-01"},{"lineNumber":382,"author":{"gitId":"AidenLYT"},"content":"**Person that can play this role:** Student in a lot of committees","lastModifiedDate":"2024-03-01"},{"lineNumber":383,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":384,"author":{"gitId":"AidenLYT"},"content":"**MSS**","lastModifiedDate":"2024-03-01"},{"lineNumber":385,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":386,"author":{"gitId":"AidenLYT"},"content":"1. User type sort contacts command","lastModifiedDate":"2024-03-01"},{"lineNumber":387,"author":{"gitId":"AidenLYT"},"content":"2. LookMeUp displays the contact in the database\\","lastModifiedDate":"2024-03-01"},{"lineNumber":388,"author":{"gitId":"AidenLYT"},"content":"Use case ends.","lastModifiedDate":"2024-03-01"},{"lineNumber":389,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":390,"author":{"gitId":"AidenLYT"},"content":"**Extensions**","lastModifiedDate":"2024-03-01"},{"lineNumber":391,"author":{"gitId":"AidenLYT"},"content":"* 1a. User typed an invalid command","lastModifiedDate":"2024-03-01"},{"lineNumber":392,"author":{"gitId":"AidenLYT"},"content":" * 1a1. LookMeUp displays the error and shows a list of commands it supports.","lastModifiedDate":"2024-03-01"},{"lineNumber":393,"author":{"gitId":"AidenLYT"},"content":" * 1a2. User enters the correct command.","lastModifiedDate":"2024-03-01"},{"lineNumber":394,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":395,"author":{"gitId":"AidenLYT"},"content":" Steps 1a1-1a2 are repeated until the command entered is correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":396,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"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":401,"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":402,"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":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":409,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":419,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":420,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"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":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"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":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"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":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"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":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"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":454,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"AidenLYT":76,"-":380,"kervyntan":8}},{"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":"AidenLYT"},"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":{"AidenLYT":1,"-":66}},{"path":"docs/team/AidenLYT.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"AidenLYT"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"AidenLYT"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"AidenLYT"},"content":" title: \"Aiden Lee Ygit uan Ting\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"AidenLYT"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"AidenLYT"},"content":"### Project: LookMeUp","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"AidenLYT"},"content":"LookMeUp is a desktop address book application targeted for NUS students who stay on campus.","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"AidenLYT"},"content":"Given how students who stay on campus find themselves in many different committees and interest groups, LookMeUp seeks to provide features that allows them to compartmentalise their contacts and access various groups easily.","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"AidenLYT"},"content":"LookMeUp also keeps track of the location and details of upcoming meetings specific to each contact, knowing when and who to make calls with.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"AidenLYT"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"AidenLYT"},"content":"* **New Feature**: ","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"AidenLYT"},"content":" * What it does: ","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"AidenLYT"},"content":" * Justification: ","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"AidenLYT"},"content":" * Highlights: ","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"AidenLYT"},"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-02-29"},{"lineNumber":19,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"AidenLYT"},"content":"* **New Feature**: ","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"AidenLYT"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"AidenLYT"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"AidenLYT"},"content":" * Set up the project repo","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"AidenLYT"},"content":" * Set up team organisation","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"AidenLYT"},"content":" * Set up the team repository ","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"AidenLYT"},"content":" * Created issues [\\#1, #7,8,9,11-17](https://github.com/AY2324S2-CS2103T-T12-2/tp/issues)","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"AidenLYT"},"content":" * Created milestones [\\v1.1 and v1.2](https://github.com/AY2324S2-CS2103T-T12-2/tp/milestones) ","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"AidenLYT"},"content":" and allocate issues to the respective milestone","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"AidenLYT"},"content":" * Assigned members to work on the respective issues","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"AidenLYT"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"AidenLYT"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"AidenLYT"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"AidenLYT"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"AidenLYT"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"AidenLYT"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"AidenLYT"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":47,"author":{"gitId":"AidenLYT"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":48,"author":{"gitId":"AidenLYT"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":49,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":50,"author":{"gitId":"AidenLYT"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":51,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":52,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":53,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"AidenLYT":53}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"lynnetteeee"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T12-2/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"lynnetteeee"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"lynnetteeee"},"content":"# *LookMeUp*","lastModifiedDate":"2024-03-07"},{"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":"lynnetteeee"},"content":"### Having TOO MANY contacts to keep track of?","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"lynnetteeee"},"content":"\u003e e.g. friends from different parts of your school life?","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"lynnetteeee"},"content":"\u003e ","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"lynnetteeee"},"content":"\u003e e.g. friends from different committees and interest groups?","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"lynnetteeee"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"lynnetteeee"},"content":"### Fret not, ","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"lynnetteeee"},"content":"this is **a project aimed to *streamline* YOUR campus life**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"lynnetteeee"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"lynnetteeee"},"content":"## Why would LookMeUp be useful?","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"lynnetteeee"},"content":"As an address book for students living on NUS campus to manage contacts, LookMeUp is designed to enable TAGGING!","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"lynnetteeee"},"content":"* **Tagging** allows you to add **multiple tags** to each contact, to keep track of the different groups they belong to.","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"lynnetteeee"},"content":"* You may **filter** your contacts via the **tags**,","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"lynnetteeee"},"content":"so you can *easily find* the contacts you need from a particular group ","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"lynnetteeee"},"content":"(e.g. when broadcasting announcements, scheduling meetings etc.)","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"lynnetteeee"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"lynnetteeee"},"content":"### How is LookMeUp created?","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"lynnetteeee"},"content":"* LookMeUp is **written in OOP fashion** - meaning, it is **easy to maintain AND _extend NEW features_!**.","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"* It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"lynnetteeee"},"content":"* Our documentation would be uploaded soon, do keep an eye out for it!","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"lynnetteeee"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"lynnetteeee"},"content":"### Acknowledgements","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"lynnetteeee"},"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":29,"author":{"gitId":"lynnetteeee"},"content":"It is a **part of the se-education.org** initiative. If you would like to contribute code to similar projects,","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"lynnetteeee"},"content":"see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"lynnetteeee":26,"-":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":"smolegz"},"content":"We are a group of Computer Science students undertaking CS2103T.","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"smolegz"},"content":"LookMeUp is an address book application that allows students to seamlessly save contacts of their peers in school. The team hopes that","lastModifiedDate":"2024-03-03"},{"lineNumber":12,"author":{"gitId":"smolegz"},"content":"this product will serve student better convenience in connecting with their friends!","lastModifiedDate":"2024-03-03"},{"lineNumber":13,"author":{"gitId":"smolegz"},"content":"For more enquiries, you can reach us at the email:","lastModifiedDate":"2024-03-03"},{"lineNumber":14,"author":{"gitId":"smolegz"},"content":"1. Koo Zhuo Hui `e0959005@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"smolegz"},"content":"2. Kervyn Tan `e0941855@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":16,"author":{"gitId":"smolegz"},"content":"3. Lynnette Ong Xin Hui `e0968030@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"smolegz"},"content":"4. Aiden Lee Yuan Ting `aidenlyt@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":18,"author":{"gitId":"smolegz"},"content":"5. Chen Runjia `runjia@u.nus.edu`","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"smolegz"},"content":"## Project Team","lastModifiedDate":"2024-03-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"smolegz"},"content":"### Zhuo Hui Koo (Ivan)","lastModifiedDate":"2024-03-03"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/smolegz.png\" width\u003d\"200px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/smolegz)]","lastModifiedDate":"2024-03-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"smolegz"},"content":"Y2 CS student. My hobby is to drink w/ my besties; I am always the “take care of other ppl” 😊","lastModifiedDate":"2024-03-03"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"smolegz"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-03"},{"lineNumber":31,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-03"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"smolegz"},"content":"### Kervyn Tan","lastModifiedDate":"2024-03-03"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/kervyntan.png\" width\u003d\"200px\" height\u003d\"240px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/kervyntan)]","lastModifiedDate":"2024-03-03"},{"lineNumber":38,"author":{"gitId":"smolegz"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":39,"author":{"gitId":"smolegz"},"content":"Y2, CS Major.","lastModifiedDate":"2024-03-03"},{"lineNumber":40,"author":{"gitId":"smolegz"},"content":"Love cycling on the weekends and playing LoL when I have time (basically never)","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"smolegz"},"content":"* Role: Developer","lastModifiedDate":"2024-03-03"},{"lineNumber":43,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"smolegz"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":45,"author":{"gitId":"smolegz"},"content":"### Lynnette Ong","lastModifiedDate":"2024-03-03"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/lynnetteeee.png\" width\u003d\"200px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/lynnetteeee)]","lastModifiedDate":"2024-03-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":51,"author":{"gitId":"smolegz"},"content":"Y2, CS, I love to travel (esp cold weather) and play squash!","lastModifiedDate":"2024-03-03"},{"lineNumber":52,"author":{"gitId":"smolegz"},"content":"I think coding without a deadline is \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e ! Lowkey therapeutic... but once theres deadline... \u003e.\u003c","lastModifiedDate":"2024-03-03"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-03-03"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"smolegz"},"content":"### Aiden Lee","lastModifiedDate":"2024-03-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/aidenlyt.png\" width\u003d\"200px\" height\u003d\"240px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/aidenlyt)]","lastModifiedDate":"2024-03-03"},{"lineNumber":62,"author":{"gitId":"smolegz"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":63,"author":{"gitId":"smolegz"},"content":"Year 2 CS student. I eat ice cream with chopsticks.","lastModifiedDate":"2024-03-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Scheduling \u0026 Tracking","lastModifiedDate":"2024-03-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"smolegz"},"content":"### RunJia Chen","lastModifiedDate":"2024-03-03"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"smolegz"},"content":"\u003cimg src\u003d\"images/runjiachen.png\" width\u003d\"200px\" height\u003d\"240px\" style\u003d\"border-radius:5%\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"smolegz"},"content":"[[Github](http://github.com/RunjiaChen)]","lastModifiedDate":"2024-03-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":74,"author":{"gitId":"smolegz"},"content":"Y1 CS, like to watch Marvel shows like Loki, What if","lastModifiedDate":"2024-03-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"smolegz"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"smolegz":42,"-":35}},{"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":"kervyntan"},"content":"NUS students who stay on campus","lastModifiedDate":"2024-03-06"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"kervyntan"},"content":"## User Stories","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"kervyntan"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"kervyntan"},"content":"1. Keeps track of the location and details of upcoming meetings specific to each contact, knowing when and who to make calls with","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"kervyntan"},"content":"2. Given how students who stay on campus find themselves in many different committees and interest groups, our Address Book seeks to provide features that allows them to compartmentalise their contacts and access various groups easily","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":290,"author":{"gitId":"kervyntan"},"content":"| `* * *` | Student in a lot of committees | Access my contacts by groups | Easily identify the people in their different committees and CCAs |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"kervyntan"},"content":"| `* * *` | Student | Sort the contacts alphabetically | Easily navigate the address book |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"kervyntan"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"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":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"AidenLYT"},"content":"**Use case:** UC1 - Add a contact\\","lastModifiedDate":"2024-03-01"},{"lineNumber":301,"author":{"gitId":"AidenLYT"},"content":"**Actor:** User\\","lastModifiedDate":"2024-03-01"},{"lineNumber":302,"author":{"gitId":"AidenLYT"},"content":"**Person that can play this role:** Student in a lot of committees","lastModifiedDate":"2024-03-01"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"AidenLYT"},"content":"1. User type add contact command.","lastModifiedDate":"2024-03-01"},{"lineNumber":307,"author":{"gitId":"AidenLYT"},"content":"2. LookMeUp prompts for details.","lastModifiedDate":"2024-03-01"},{"lineNumber":308,"author":{"gitId":"AidenLYT"},"content":"3. User enters the requested details.","lastModifiedDate":"2024-03-01"},{"lineNumber":309,"author":{"gitId":"AidenLYT"},"content":"4. LookMeUp add the contact and displays the new contact in the database.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":310,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-01"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-01"},{"lineNumber":313,"author":{"gitId":"AidenLYT"},"content":"* 1a. User typed an invalid command","lastModifiedDate":"2024-03-01"},{"lineNumber":314,"author":{"gitId":"AidenLYT"},"content":" * 1a1. LookMeUp displays the error and shows a list of commands it supports.","lastModifiedDate":"2024-03-01"},{"lineNumber":315,"author":{"gitId":"AidenLYT"},"content":" * 1a2. User enters the correct command.","lastModifiedDate":"2024-03-01"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":317,"author":{"gitId":"AidenLYT"},"content":" Steps 1a1-1a2 are repeated until the command entered is correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":318,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":320,"author":{"gitId":"AidenLYT"},"content":"* 3a. LookMeUp detects an error in the entered data.","lastModifiedDate":"2024-03-01"},{"lineNumber":321,"author":{"gitId":"AidenLYT"},"content":" * 3a1. LookMeUp displays the error and requests for the correct data.","lastModifiedDate":"2024-03-01"},{"lineNumber":322,"author":{"gitId":"AidenLYT"},"content":" * 3a2. User enters the new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":323,"author":{"gitId":"AidenLYT"},"content":" ","lastModifiedDate":"2024-03-01"},{"lineNumber":324,"author":{"gitId":"AidenLYT"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":325,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-01"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":327,"author":{"gitId":"AidenLYT"},"content":"**Use case:** UC2 - Remove a contact\\","lastModifiedDate":"2024-03-01"},{"lineNumber":328,"author":{"gitId":"AidenLYT"},"content":"**Actor:** User\\","lastModifiedDate":"2024-03-01"},{"lineNumber":329,"author":{"gitId":"AidenLYT"},"content":"**Person that can play this role:** Student in a lot of committees","lastModifiedDate":"2024-03-01"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"AidenLYT"},"content":"**MSS**","lastModifiedDate":"2024-03-01"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":333,"author":{"gitId":"AidenLYT"},"content":"1. User type remove contact command ","lastModifiedDate":"2024-03-01"},{"lineNumber":334,"author":{"gitId":"AidenLYT"},"content":"2. LookMeUp prompts for details ","lastModifiedDate":"2024-03-01"},{"lineNumber":335,"author":{"gitId":"AidenLYT"},"content":"3. User enters the requested details ","lastModifiedDate":"2024-03-01"},{"lineNumber":336,"author":{"gitId":"AidenLYT"},"content":"4. LookMeUp requests for confirmation. ","lastModifiedDate":"2024-03-01"},{"lineNumber":337,"author":{"gitId":"AidenLYT"},"content":"5. LookMeUp removes the contact and displays an execution success message.\\","lastModifiedDate":"2024-03-01"},{"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":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":341,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"AidenLYT"},"content":"* 1a. User typed an invalid command","lastModifiedDate":"2024-03-01"},{"lineNumber":343,"author":{"gitId":"AidenLYT"},"content":" * 1a1. LookMeUp displays the error and shows a list of commands it supports.","lastModifiedDate":"2024-03-01"},{"lineNumber":344,"author":{"gitId":"AidenLYT"},"content":" * 1a2. User enters the correct command.","lastModifiedDate":"2024-03-01"},{"lineNumber":345,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":346,"author":{"gitId":"AidenLYT"},"content":" Steps 1a1-1a2 are repeated until the command entered is correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":347,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":348,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":349,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":350,"author":{"gitId":"AidenLYT"},"content":"* 3a. LookMeUp detects an error in the entered data.","lastModifiedDate":"2024-03-01"},{"lineNumber":351,"author":{"gitId":"AidenLYT"},"content":" * 3a1. LookMeUp displays the error and requests for the correct data.","lastModifiedDate":"2024-03-01"},{"lineNumber":352,"author":{"gitId":"AidenLYT"},"content":" * 3a2. User enters the new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":353,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":354,"author":{"gitId":"AidenLYT"},"content":" Steps 3a1-3a2 are repeated until the data entered are correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":355,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-01"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"AidenLYT"},"content":"* 4a. User declines the removal of contact.","lastModifiedDate":"2024-03-01"},{"lineNumber":359,"author":{"gitId":"AidenLYT"},"content":" * 4a1, LookMeUp confirms user\u0027s selection.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":360,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"AidenLYT"},"content":"**Use case:** UC3 - Filter contacts by tags\\","lastModifiedDate":"2024-03-01"},{"lineNumber":363,"author":{"gitId":"AidenLYT"},"content":"**Actor:** User\\","lastModifiedDate":"2024-03-01"},{"lineNumber":364,"author":{"gitId":"AidenLYT"},"content":"**Person that can play this role:** Student in a lot of committees","lastModifiedDate":"2024-03-01"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"AidenLYT"},"content":"**MSS**","lastModifiedDate":"2024-03-01"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"AidenLYT"},"content":"1. User type filter contacts command ","lastModifiedDate":"2024-03-01"},{"lineNumber":369,"author":{"gitId":"AidenLYT"},"content":"2. LookMeUp displays the contact in the database\\","lastModifiedDate":"2024-03-01"},{"lineNumber":370,"author":{"gitId":"AidenLYT"},"content":"Use case ends.","lastModifiedDate":"2024-03-01"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"AidenLYT"},"content":"**Extensions**","lastModifiedDate":"2024-03-01"},{"lineNumber":373,"author":{"gitId":"AidenLYT"},"content":"* 1a. User typed an invalid command","lastModifiedDate":"2024-03-01"},{"lineNumber":374,"author":{"gitId":"AidenLYT"},"content":" * 1a1. LookMeUp displays the error and shows a list of commands it supports.","lastModifiedDate":"2024-03-01"},{"lineNumber":375,"author":{"gitId":"AidenLYT"},"content":" * 1a2. User enters the correct command.","lastModifiedDate":"2024-03-01"},{"lineNumber":376,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":377,"author":{"gitId":"AidenLYT"},"content":" Steps 1a1-1a2 are repeated until the command entered is correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":378,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":379,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":380,"author":{"gitId":"AidenLYT"},"content":"**Use case:** UC4 - Sort contacts by tags\\","lastModifiedDate":"2024-03-01"},{"lineNumber":381,"author":{"gitId":"AidenLYT"},"content":"**Actor:** User\\","lastModifiedDate":"2024-03-01"},{"lineNumber":382,"author":{"gitId":"AidenLYT"},"content":"**Person that can play this role:** Student in a lot of committees","lastModifiedDate":"2024-03-01"},{"lineNumber":383,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":384,"author":{"gitId":"AidenLYT"},"content":"**MSS**","lastModifiedDate":"2024-03-01"},{"lineNumber":385,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":386,"author":{"gitId":"AidenLYT"},"content":"1. User type sort contacts command","lastModifiedDate":"2024-03-01"},{"lineNumber":387,"author":{"gitId":"AidenLYT"},"content":"2. LookMeUp displays the contact in the database\\","lastModifiedDate":"2024-03-01"},{"lineNumber":388,"author":{"gitId":"AidenLYT"},"content":"Use case ends.","lastModifiedDate":"2024-03-01"},{"lineNumber":389,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":390,"author":{"gitId":"AidenLYT"},"content":"**Extensions**","lastModifiedDate":"2024-03-01"},{"lineNumber":391,"author":{"gitId":"AidenLYT"},"content":"* 1a. User typed an invalid command","lastModifiedDate":"2024-03-01"},{"lineNumber":392,"author":{"gitId":"AidenLYT"},"content":" * 1a1. LookMeUp displays the error and shows a list of commands it supports.","lastModifiedDate":"2024-03-01"},{"lineNumber":393,"author":{"gitId":"AidenLYT"},"content":" * 1a2. User enters the correct command.","lastModifiedDate":"2024-03-01"},{"lineNumber":394,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":395,"author":{"gitId":"AidenLYT"},"content":" Steps 1a1-1a2 are repeated until the command entered is correct.\\","lastModifiedDate":"2024-03-01"},{"lineNumber":396,"author":{"gitId":"AidenLYT"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"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":401,"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":402,"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":403,"author":{"gitId":"RunjiaChen"},"content":"4. A user should be able to add contacts even if they are not IT-savvy.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"RunjiaChen"},"content":"5. Any operation executed on the app (list, delete, add, etc) should not take more than 10 minutes to process.","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"RunjiaChen"},"content":"6. The startup time for the application should not take more than 10 minutes.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"RunjiaChen"},"content":"7. Side pop-up windows should not interfere with the execution of commands in the main window.","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":413,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"RunjiaChen"},"content":"* **IT-savvy**: The user is not familiar with the exact format of the add command. ","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"RunjiaChen"},"content":"* **Side pop-up window**: Additional windows that can be opened by the user during usage of the software(e.g. the help window).","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"RunjiaChen"},"content":"* ","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":426,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":427,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"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":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"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":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"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":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"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":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"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":461,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"AidenLYT":76,"RunjiaChen":7,"-":380,"kervyntan":8}},{"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":"AidenLYT"},"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":{"AidenLYT":1,"-":66}},{"path":"docs/team/AidenLYT.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"AidenLYT"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"AidenLYT"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"AidenLYT"},"content":" title: \"Aiden Lee Ygit uan Ting\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"AidenLYT"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"AidenLYT"},"content":"### Project: LookMeUp","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"AidenLYT"},"content":"LookMeUp is a desktop address book application targeted for NUS students who stay on campus.","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"AidenLYT"},"content":"Given how students who stay on campus find themselves in many different committees and interest groups, LookMeUp seeks to provide features that allows them to compartmentalise their contacts and access various groups easily.","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"AidenLYT"},"content":"LookMeUp also keeps track of the location and details of upcoming meetings specific to each contact, knowing when and who to make calls with.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"AidenLYT"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"AidenLYT"},"content":"* **New Feature**: ","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"AidenLYT"},"content":" * What it does: ","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"AidenLYT"},"content":" * Justification: ","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"AidenLYT"},"content":" * Highlights: ","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"AidenLYT"},"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-02-29"},{"lineNumber":19,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"AidenLYT"},"content":"* **New Feature**: ","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"AidenLYT"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"AidenLYT"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"AidenLYT"},"content":" * Set up the project repo","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"AidenLYT"},"content":" * Set up team organisation","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"AidenLYT"},"content":" * Set up the team repository ","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"AidenLYT"},"content":" * Created issues [\\#1, #7,8,9,11-17](https://github.com/AY2324S2-CS2103T-T12-2/tp/issues)","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"AidenLYT"},"content":" * Created milestones [\\v1.1 and v1.2](https://github.com/AY2324S2-CS2103T-T12-2/tp/milestones) ","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"AidenLYT"},"content":" and allocate issues to the respective milestone","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"AidenLYT"},"content":" * Assigned members to work on the respective issues","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"AidenLYT"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"AidenLYT"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"AidenLYT"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"AidenLYT"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"AidenLYT"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"AidenLYT"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"AidenLYT"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":47,"author":{"gitId":"AidenLYT"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":48,"author":{"gitId":"AidenLYT"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":49,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":50,"author":{"gitId":"AidenLYT"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":51,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":52,"author":{"gitId":"AidenLYT"},"content":" * ","lastModifiedDate":"2024-02-29"},{"lineNumber":53,"author":{"gitId":"AidenLYT"},"content":"","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"AidenLYT":53}},{"path":"docs/team/KervynTanJiawei.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kervyntan"},"content":"# Kervyn Tan Jiawei","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"kervyntan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"kervyntan"},"content":"## About Me","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"kervyntan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"kervyntan"},"content":"Y2 Computer Science student passionate in the world of Web Development!","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"kervyntan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"kervyntan"},"content":"Like to read books on programming/new topics as well as cycling on the weekends","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"kervyntan":7}},{"path":"docs/team/OngXinHuiLynnette.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"lynnetteeee"},"content":"# Hi! I\u0027m Lynnette (@lynnetteeee) :D","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"lynnetteeee"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"lynnetteeee"},"content":"## Some background info","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"lynnetteeee"},"content":"I\u0027m a Year 2 Computer Science student at NUS. I\u0027m interested in cybersecurity and I recently started","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"lynnetteeee"},"content":"taking part in Capture-The-Flag (CTF) competitions.","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"lynnetteeee"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"lynnetteeee"},"content":"## Some fun facts","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"lynnetteeee"},"content":"I love to discover good food places, and I\u0027m always on the lookout for new cafes too!","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"lynnetteeee"},"content":"I also enjoy travelling and exploring new places.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"lynnetteeee":9}},{"path":"docs/team/ZhuoHui.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"smolegz"},"content":"# Koo Zhuo Hui","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"smolegz"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"smolegz"},"content":"## About Myself","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"smolegz"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"smolegz"},"content":"I am a Year 2 Computer Science student! My favourite food includes","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"smolegz"},"content":"Mala,pasta and bubbletea!","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"smolegz":6}},{"path":"src/main/java/seedu/address/AddCommandHelper.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"RunjiaChen"},"content":"package seedu.address;","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"RunjiaChen"},"content":"import javafx.application.Application;","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.Scene;","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.control.Button;","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.control.ScrollPane;","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.control.TextField;","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.layout.AnchorPane;","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.layout.VBox;","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"RunjiaChen"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"RunjiaChen"},"content":"public class AddCommandHelper{","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"RunjiaChen"},"content":" private ScrollPane scrollPane;","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"RunjiaChen"},"content":" private VBox dialogContainer;","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"RunjiaChen"},"content":" private TextField userInput;","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"RunjiaChen"},"content":" private Button sendButton;","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"RunjiaChen"},"content":" private Scene scene;","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"RunjiaChen"},"content":" private status status;","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"RunjiaChen"},"content":" public String getResponse(String text) {","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"RunjiaChen"},"content":" return text;","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"RunjiaChen"},"content":" private enum status {GET_NAME, GET_NUMBER, GET_EMAIL, GET_ADDRESS, GET_TAG}","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"RunjiaChen"},"content":"}","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"RunjiaChen":38}},{"path":"src/main/java/seedu/address/logic/commands/AddByStepCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"RunjiaChen"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"RunjiaChen"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"RunjiaChen"},"content":"public class AddByStepCommand extends Command {","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"RunjiaChen"},"content":" public static final String COMMAND_WORD \u003d \"addbystep\";","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"RunjiaChen"},"content":" public static final String MESSAGE_SUCCESS \u003d \"addbystep\";","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"RunjiaChen"},"content":" @Override","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"RunjiaChen"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"RunjiaChen"},"content":" return new CommandResult(MESSAGE_SUCCESS,false,false,true);","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"RunjiaChen"},"content":"}","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"RunjiaChen":15}},{"path":"src/main/java/seedu/address/logic/commands/CommandResult.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"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":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2018-12-09"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Represents the result of a command execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class CommandResult {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private final String feedbackToUser;","lastModifiedDate":"2018-12-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /** Help information should be shown to the user. */","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" private final boolean showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /** The application should exit. */","lastModifiedDate":"2018-12-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final boolean exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":22,"author":{"gitId":"RunjiaChen"},"content":" /** The application is undergoing addByStep process. */","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"RunjiaChen"},"content":" private final boolean isAddByStep;","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Constructs a {@code CommandResult} with the specified fields.","lastModifiedDate":"2018-12-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public CommandResult(String feedbackToUser, boolean showHelp, boolean exit) {","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.feedbackToUser \u003d requireNonNull(feedbackToUser);","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" this.showHelp \u003d showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.exit \u003d exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"RunjiaChen"},"content":" this.isAddByStep \u003d false;","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"RunjiaChen"},"content":" public CommandResult(String feedbackToUser, boolean showHelp, boolean exit, boolean isAddByStep) {","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"RunjiaChen"},"content":" this.feedbackToUser \u003d requireNonNull(feedbackToUser);","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"RunjiaChen"},"content":" this.showHelp \u003d showHelp;","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"RunjiaChen"},"content":" this.exit \u003d exit;","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"RunjiaChen"},"content":" this.isAddByStep \u003d isAddByStep;","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Constructs a {@code CommandResult} with the specified {@code feedbackToUser},","lastModifiedDate":"2018-12-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * and other fields set to their default value.","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public CommandResult(String feedbackToUser) {","lastModifiedDate":"2018-12-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":" this(feedbackToUser, false, false);","lastModifiedDate":"2018-12-09"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public String getFeedbackToUser() {","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return feedbackToUser;","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public boolean isShowHelp() {","lastModifiedDate":"2018-12-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return showHelp;","lastModifiedDate":"2018-12-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public boolean isExit() {","lastModifiedDate":"2018-12-09"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":62,"author":{"gitId":"RunjiaChen"},"content":" public boolean isAddByStep() {","lastModifiedDate":"2024-03-07"},{"lineNumber":63,"author":{"gitId":"RunjiaChen"},"content":" return isAddByStep;","lastModifiedDate":"2024-03-07"},{"lineNumber":64,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":65,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2018-12-09"},{"lineNumber":68,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-12-09"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-12-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2018-12-09"},{"lineNumber":73,"author":{"gitId":"-"},"content":" if (!(other instanceof CommandResult)) {","lastModifiedDate":"2018-12-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":77,"author":{"gitId":"-"},"content":" CommandResult otherCommandResult \u003d (CommandResult) other;","lastModifiedDate":"2018-12-09"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return feedbackToUser.equals(otherCommandResult.feedbackToUser)","lastModifiedDate":"2018-12-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" \u0026\u0026 showHelp \u003d\u003d otherCommandResult.showHelp","lastModifiedDate":"2018-12-09"},{"lineNumber":80,"author":{"gitId":"-"},"content":" \u0026\u0026 exit \u003d\u003d otherCommandResult.exit;","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":83,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return Objects.hash(feedbackToUser, showHelp, exit);","lastModifiedDate":"2018-12-09"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":88,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":" .add(\"feedbackToUser\", feedbackToUser)","lastModifiedDate":"2019-02-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":" .add(\"showHelp\", showHelp)","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" .add(\"exit\", exit)","lastModifiedDate":"2019-02-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"RunjiaChen":15,"-":82}},{"path":"src/main/java/seedu/address/logic/parser/AddressBookParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2023-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.LogsCenter;","lastModifiedDate":"2023-07-29"},{"lineNumber":11,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ClearCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.Command;","lastModifiedDate":"2017-01-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.DeleteCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ExitCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.FindCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.HelpCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ListCommand;","lastModifiedDate":"2017-01-18"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":23,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Parses user input.","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":"public class AddressBookParser {","lastModifiedDate":"2017-07-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Used for initial separation of command word and args.","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Pattern BASIC_COMMAND_FORMAT \u003d Pattern.compile(\"(?\u003ccommandWord\u003e\\\\S+)(?\u003carguments\u003e.*)\");","lastModifiedDate":"2016-09-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(AddressBookParser.class);","lastModifiedDate":"2023-07-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Parses user input into command for execution.","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @param userInput full user input string","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * @return the command based on the user input","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" final Matcher matcher \u003d BASIC_COMMAND_FORMAT.matcher(userInput.trim());","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" if (!matcher.matches()) {","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // Note to developers: Change the log level in config.json to enable lower level (i.e., FINE, FINER and lower)","lastModifiedDate":"2023-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // log messages such as the one below.","lastModifiedDate":"2023-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // Lower level log messages are used sparingly to minimize noise in the code.","lastModifiedDate":"2023-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" logger.fine(\"Command word: \" + commandWord + \"; Arguments: \" + arguments);","lastModifiedDate":"2023-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":" switch (commandWord) {","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" case AddCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return new AddCommandParser().parse(arguments);","lastModifiedDate":"2017-02-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2016-12-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" case DeleteCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return new DeleteCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" case ClearCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return new ClearCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":" case FindCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return new FindCommandParser().parse(arguments);","lastModifiedDate":"2017-01-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":" case ListCommand.COMMAND_WORD:","lastModifiedDate":"2016-09-21"},{"lineNumber":73,"author":{"gitId":"-"},"content":" return new ListCommand();","lastModifiedDate":"2016-09-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" case ExitCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return new ExitCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" case HelpCommand.COMMAND_WORD:","lastModifiedDate":"2016-08-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return new HelpCommand();","lastModifiedDate":"2016-08-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-14"},{"lineNumber":81,"author":{"gitId":"RunjiaChen"},"content":" case AddByStepCommand.COMMAND_WORD:","lastModifiedDate":"2024-03-07"},{"lineNumber":82,"author":{"gitId":"RunjiaChen"},"content":" return new AddByStepCommand();","lastModifiedDate":"2024-03-07"},{"lineNumber":83,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":" default:","lastModifiedDate":"2016-08-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" logger.finer(\"This user input caused a ParseException: \" + userInput);","lastModifiedDate":"2023-07-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-03-11"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":90,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"RunjiaChen":4,"-":86}},{"path":"src/main/java/seedu/address/ui/CommandHelperWindow.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"RunjiaChen"},"content":"package seedu.address.ui;","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"RunjiaChen"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.control.Button;","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.control.ScrollPane;","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.control.TextField;","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.layout.AnchorPane;","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.layout.VBox;","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.layout.AnchorPane;","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"RunjiaChen"},"content":"import seedu.address.AddCommandHelper;","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"RunjiaChen"},"content":"public class CommandHelperWindow extends AnchorPane {","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"RunjiaChen"},"content":" @FXML","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"RunjiaChen"},"content":" private ScrollPane scrollPane;","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"RunjiaChen"},"content":" @FXML","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"RunjiaChen"},"content":" private VBox dialogContainer;","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"RunjiaChen"},"content":" @FXML","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"RunjiaChen"},"content":" private TextField userInput;","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"RunjiaChen"},"content":" @FXML","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"RunjiaChen"},"content":" private Button sendButton;","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"RunjiaChen"},"content":" private AddCommandHelper addCommandHelper;","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"RunjiaChen"},"content":" @FXML","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"RunjiaChen"},"content":" public void initialize() {","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"RunjiaChen"},"content":" scrollPane.vvalueProperty().bind(dialogContainer.heightProperty());","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"RunjiaChen"},"content":" public void setCommandHelper(AddCommandHelper a) {","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"RunjiaChen"},"content":" this.addCommandHelper \u003d a;","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"RunjiaChen"},"content":" /**","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"RunjiaChen"},"content":" * Creates two dialog boxes, one echoing user input and the other containing Duke\u0027s reply and then appends them to","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"RunjiaChen"},"content":" * the dialog container. Clears the user input after processing.","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"RunjiaChen"},"content":" */","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"RunjiaChen"},"content":" @FXML","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"RunjiaChen"},"content":" private void handleUserInput() {","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"RunjiaChen"},"content":" String input \u003d userInput.getText();","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"RunjiaChen"},"content":" String response \u003d addCommandHelper.getResponse(input);","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"RunjiaChen"},"content":" dialogContainer.getChildren().addAll(","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"RunjiaChen"},"content":" DialogBox.getUserDialog(input),","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"RunjiaChen"},"content":" DialogBox.getDukeDialog(response)","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"RunjiaChen"},"content":" );","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"RunjiaChen"},"content":" userInput.clear();","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"RunjiaChen"},"content":"}","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"RunjiaChen":48}},{"path":"src/main/java/seedu/address/ui/DialogBox.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"RunjiaChen"},"content":"package seedu.address.ui;","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"RunjiaChen"},"content":"import java.io.IOException;","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"RunjiaChen"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"RunjiaChen"},"content":"import javafx.fxml.FXMLLoader;","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.control.Label;","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.layout.HBox;","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"RunjiaChen"},"content":"/**","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"RunjiaChen"},"content":" * An example of a custom control using FXML.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"RunjiaChen"},"content":" * This control represents a dialog box consisting of an ImageView to represent the speaker\u0027s face and a label","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"RunjiaChen"},"content":" * containing text from the speaker.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"RunjiaChen"},"content":" */","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"RunjiaChen"},"content":"public class DialogBox extends HBox {","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"RunjiaChen"},"content":" @FXML","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"RunjiaChen"},"content":" private Label dialog;","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"RunjiaChen"},"content":" private DialogBox(String text) {","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"RunjiaChen"},"content":" try {","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"RunjiaChen"},"content":" FXMLLoader fxmlLoader \u003d new FXMLLoader(MainWindow.class.getResource(\"/view/DialogBox.fxml\"));","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"RunjiaChen"},"content":" fxmlLoader.setController(this);","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"RunjiaChen"},"content":" fxmlLoader.setRoot(this);","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"RunjiaChen"},"content":" fxmlLoader.load();","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"RunjiaChen"},"content":" } catch (IOException e) {","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"RunjiaChen"},"content":" e.printStackTrace();","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"RunjiaChen"},"content":" dialog.setText(text);","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"RunjiaChen"},"content":" public static DialogBox getUserDialog(String text) {","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"RunjiaChen"},"content":" return new DialogBox(text);","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"RunjiaChen"},"content":" public static DialogBox getDukeDialog(String text) {","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"RunjiaChen"},"content":" var db \u003d new DialogBox(text);","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"RunjiaChen"},"content":" return db;","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"RunjiaChen"},"content":"}","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"RunjiaChen":44}},{"path":"src/main/java/seedu/address/ui/MainWindow.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.ui;","lastModifiedDate":"2016-09-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":3,"author":{"gitId":"RunjiaChen"},"content":"import java.io.IOException;","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-06-16"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":6,"author":{"gitId":"RunjiaChen"},"content":"import javafx.application.Application;","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import javafx.event.ActionEvent;","lastModifiedDate":"2016-12-18"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import javafx.fxml.FXML;","lastModifiedDate":"2016-08-26"},{"lineNumber":9,"author":{"gitId":"RunjiaChen"},"content":"import javafx.fxml.FXMLLoader;","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.Scene;","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import javafx.scene.control.MenuItem;","lastModifiedDate":"2016-08-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import javafx.scene.control.TextInputControl;","lastModifiedDate":"2016-12-18"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import javafx.scene.input.KeyCombination;","lastModifiedDate":"2016-08-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import javafx.scene.input.KeyEvent;","lastModifiedDate":"2016-12-18"},{"lineNumber":15,"author":{"gitId":"RunjiaChen"},"content":"import javafx.scene.layout.AnchorPane;","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import javafx.scene.layout.StackPane;","lastModifiedDate":"2017-05-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import javafx.stage.Stage;","lastModifiedDate":"2016-08-18"},{"lineNumber":18,"author":{"gitId":"RunjiaChen"},"content":"import seedu.address.AddCommandHelper;","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"RunjiaChen"},"content":"import seedu.address.Main;","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2016-09-28"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.LogsCenter;","lastModifiedDate":"2017-06-16"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.Logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.CommandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2018-12-09"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-18"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * The Main Window. Provides the basic application layout containing","lastModifiedDate":"2016-08-18"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * a menu bar and space where other JavaFX elements can be placed.","lastModifiedDate":"2016-08-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":31,"author":{"gitId":"-"},"content":"public class MainWindow extends UiPart\u003cStage\u003e {","lastModifiedDate":"2017-11-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"MainWindow.fxml\";","lastModifiedDate":"2016-08-18"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private final Logger logger \u003d LogsCenter.getLogger(getClass());","lastModifiedDate":"2018-08-14"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-16"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private Stage primaryStage;","lastModifiedDate":"2016-12-02"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // Independent Ui parts residing in this Ui container","lastModifiedDate":"2016-08-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private PersonListPanel personListPanel;","lastModifiedDate":"2016-08-18"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private ResultDisplay resultDisplay;","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private HelpWindow helpWindow;","lastModifiedDate":"2018-03-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":45,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private StackPane commandBoxPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private MenuItem helpMenuItem;","lastModifiedDate":"2016-08-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private StackPane personListPanelPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":57,"author":{"gitId":"-"},"content":" private StackPane resultDisplayPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private StackPane statusbarPlaceholder;","lastModifiedDate":"2017-05-09"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Creates a {@code MainWindow} with the given {@code Stage} and {@code Logic}.","lastModifiedDate":"2020-05-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public MainWindow(Stage primaryStage, Logic logic) {","lastModifiedDate":"2018-12-08"},{"lineNumber":66,"author":{"gitId":"-"},"content":" super(FXML, primaryStage);","lastModifiedDate":"2017-11-29"},{"lineNumber":67,"author":{"gitId":"RunjiaChen"},"content":" System.out.println(\"yay\");","lastModifiedDate":"2024-03-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // Set dependencies","lastModifiedDate":"2016-09-21"},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.primaryStage \u003d primaryStage;","lastModifiedDate":"2016-12-02"},{"lineNumber":70,"author":{"gitId":"-"},"content":" this.logic \u003d logic;","lastModifiedDate":"2016-09-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // Configure the UI","lastModifiedDate":"2016-09-21"},{"lineNumber":73,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" setWindowDefaultSize(logic.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":76,"author":{"gitId":"-"},"content":" setAccelerators();","lastModifiedDate":"2016-09-21"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-15"},{"lineNumber":78,"author":{"gitId":"-"},"content":" helpWindow \u003d new HelpWindow();","lastModifiedDate":"2018-03-15"},{"lineNumber":79,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":80,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":81,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public Stage getPrimaryStage() {","lastModifiedDate":"2016-12-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return primaryStage;","lastModifiedDate":"2016-12-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private void setAccelerators() {","lastModifiedDate":"2016-09-21"},{"lineNumber":89,"author":{"gitId":"-"},"content":" setAccelerator(helpMenuItem, KeyCombination.valueOf(\"F1\"));","lastModifiedDate":"2016-12-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-18"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Sets the accelerator of a MenuItem.","lastModifiedDate":"2016-12-18"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * @param keyCombination the KeyCombination value of the accelerator","lastModifiedDate":"2016-12-18"},{"lineNumber":95,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-18"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private void setAccelerator(MenuItem menuItem, KeyCombination keyCombination) {","lastModifiedDate":"2016-12-18"},{"lineNumber":97,"author":{"gitId":"-"},"content":" menuItem.setAccelerator(keyCombination);","lastModifiedDate":"2016-12-18"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-18"},{"lineNumber":99,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2016-12-18"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * TODO: the code below can be removed once the bug reported here","lastModifiedDate":"2016-12-18"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * https://bugs.openjdk.java.net/browse/JDK-8131666","lastModifiedDate":"2016-12-18"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * is fixed in later version of SDK.","lastModifiedDate":"2016-12-18"},{"lineNumber":103,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-12-18"},{"lineNumber":104,"author":{"gitId":"-"},"content":" * According to the bug report, TextInputControl (TextField, TextArea) will","lastModifiedDate":"2016-12-18"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * consume function-key events. Because CommandBox contains a TextField, and","lastModifiedDate":"2016-12-18"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * ResultDisplay contains a TextArea, thus some accelerators (e.g F1) will","lastModifiedDate":"2016-12-18"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * not work when the focus is in them because the key event is consumed by","lastModifiedDate":"2016-12-18"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * the TextInputControl(s).","lastModifiedDate":"2016-12-18"},{"lineNumber":109,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-12-18"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * For now, we add following event filter to capture such key events and open","lastModifiedDate":"2016-12-18"},{"lineNumber":111,"author":{"gitId":"-"},"content":" * help window purposely so to support accelerators even when focus is","lastModifiedDate":"2016-12-18"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * in CommandBox or ResultDisplay.","lastModifiedDate":"2016-12-18"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-18"},{"lineNumber":114,"author":{"gitId":"-"},"content":" getRoot().addEventFilter(KeyEvent.KEY_PRESSED, event -\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":115,"author":{"gitId":"-"},"content":" if (event.getTarget() instanceof TextInputControl \u0026\u0026 keyCombination.match(event)) {","lastModifiedDate":"2016-12-18"},{"lineNumber":116,"author":{"gitId":"-"},"content":" menuItem.getOnAction().handle(new ActionEvent());","lastModifiedDate":"2016-12-18"},{"lineNumber":117,"author":{"gitId":"-"},"content":" event.consume();","lastModifiedDate":"2016-12-18"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":119,"author":{"gitId":"-"},"content":" });","lastModifiedDate":"2016-12-18"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":122,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":123,"author":{"gitId":"-"},"content":" * Fills up all the placeholders of this window.","lastModifiedDate":"2017-08-16"},{"lineNumber":124,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":125,"author":{"gitId":"-"},"content":" void fillInnerParts() {","lastModifiedDate":"2016-09-21"},{"lineNumber":126,"author":{"gitId":"-"},"content":" personListPanel \u003d new PersonListPanel(logic.getFilteredPersonList());","lastModifiedDate":"2019-01-25"},{"lineNumber":127,"author":{"gitId":"-"},"content":" personListPanelPlaceholder.getChildren().add(personListPanel.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" resultDisplay \u003d new ResultDisplay();","lastModifiedDate":"2018-12-09"},{"lineNumber":130,"author":{"gitId":"-"},"content":" resultDisplayPlaceholder.getChildren().add(resultDisplay.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" StatusBarFooter statusBarFooter \u003d new StatusBarFooter(logic.getAddressBookFilePath());","lastModifiedDate":"2019-01-25"},{"lineNumber":133,"author":{"gitId":"-"},"content":" statusbarPlaceholder.getChildren().add(statusBarFooter.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" CommandBox commandBox \u003d new CommandBox(this::executeCommand);","lastModifiedDate":"2019-01-25"},{"lineNumber":136,"author":{"gitId":"-"},"content":" commandBoxPlaceholder.getChildren().add(commandBox.getRoot());","lastModifiedDate":"2017-06-14"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":139,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-18"},{"lineNumber":140,"author":{"gitId":"-"},"content":" * Sets the default size based on {@code guiSettings}.","lastModifiedDate":"2018-11-27"},{"lineNumber":141,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":142,"author":{"gitId":"-"},"content":" private void setWindowDefaultSize(GuiSettings guiSettings) {","lastModifiedDate":"2018-11-27"},{"lineNumber":143,"author":{"gitId":"-"},"content":" primaryStage.setHeight(guiSettings.getWindowHeight());","lastModifiedDate":"2018-11-27"},{"lineNumber":144,"author":{"gitId":"-"},"content":" primaryStage.setWidth(guiSettings.getWindowWidth());","lastModifiedDate":"2018-11-27"},{"lineNumber":145,"author":{"gitId":"-"},"content":" if (guiSettings.getWindowCoordinates() !\u003d null) {","lastModifiedDate":"2018-11-27"},{"lineNumber":146,"author":{"gitId":"-"},"content":" primaryStage.setX(guiSettings.getWindowCoordinates().getX());","lastModifiedDate":"2018-11-27"},{"lineNumber":147,"author":{"gitId":"-"},"content":" primaryStage.setY(guiSettings.getWindowCoordinates().getY());","lastModifiedDate":"2018-11-27"},{"lineNumber":148,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":151,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":152,"author":{"gitId":"-"},"content":" * Opens the help window or focuses on it if it\u0027s already opened.","lastModifiedDate":"2018-03-15"},{"lineNumber":153,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":154,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":155,"author":{"gitId":"-"},"content":" public void handleHelp() {","lastModifiedDate":"2016-08-31"},{"lineNumber":156,"author":{"gitId":"-"},"content":" if (!helpWindow.isShowing()) {","lastModifiedDate":"2018-03-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" helpWindow.show();","lastModifiedDate":"2016-08-18"},{"lineNumber":158,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":" helpWindow.focus();","lastModifiedDate":"2018-03-15"},{"lineNumber":160,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-15"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":163,"author":{"gitId":"RunjiaChen"},"content":" @FXML","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"RunjiaChen"},"content":" private void handleAddByStep() {","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"RunjiaChen"},"content":" try {","lastModifiedDate":"2024-03-07"},{"lineNumber":166,"author":{"gitId":"RunjiaChen"},"content":" Stage stage \u003d new Stage();","lastModifiedDate":"2024-03-07"},{"lineNumber":167,"author":{"gitId":"RunjiaChen"},"content":" FXMLLoader fxmlLoader \u003d new FXMLLoader(Main.class.getResource(\"/view/CommandHelperWindow.fxml\"));","lastModifiedDate":"2024-03-07"},{"lineNumber":168,"author":{"gitId":"RunjiaChen"},"content":" AnchorPane ap \u003d fxmlLoader.load();","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"RunjiaChen"},"content":" Scene scene \u003d new Scene(ap);","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"RunjiaChen"},"content":" stage.setScene(scene);","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"RunjiaChen"},"content":" fxmlLoader.\u003cCommandHelperWindow\u003egetController().setCommandHelper(new AddCommandHelper());","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"RunjiaChen"},"content":" stage.show();","lastModifiedDate":"2024-03-07"},{"lineNumber":173,"author":{"gitId":"RunjiaChen"},"content":" } catch (IOException e) {","lastModifiedDate":"2024-03-07"},{"lineNumber":174,"author":{"gitId":"RunjiaChen"},"content":" e.printStackTrace();","lastModifiedDate":"2024-03-07"},{"lineNumber":175,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":177,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":178,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":179,"author":{"gitId":"-"},"content":" void show() {","lastModifiedDate":"2016-10-15"},{"lineNumber":180,"author":{"gitId":"-"},"content":" primaryStage.show();","lastModifiedDate":"2016-08-18"},{"lineNumber":181,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-18"},{"lineNumber":183,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-18"},{"lineNumber":184,"author":{"gitId":"-"},"content":" * Closes the application.","lastModifiedDate":"2016-08-18"},{"lineNumber":185,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-18"},{"lineNumber":186,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-08-18"},{"lineNumber":187,"author":{"gitId":"-"},"content":" private void handleExit() {","lastModifiedDate":"2016-08-18"},{"lineNumber":188,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings(primaryStage.getWidth(), primaryStage.getHeight(),","lastModifiedDate":"2018-12-08"},{"lineNumber":189,"author":{"gitId":"-"},"content":" (int) primaryStage.getX(), (int) primaryStage.getY());","lastModifiedDate":"2018-12-08"},{"lineNumber":190,"author":{"gitId":"-"},"content":" logic.setGuiSettings(guiSettings);","lastModifiedDate":"2018-12-08"},{"lineNumber":191,"author":{"gitId":"-"},"content":" helpWindow.hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":192,"author":{"gitId":"-"},"content":" primaryStage.hide();","lastModifiedDate":"2018-12-08"},{"lineNumber":193,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-18"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-25"},{"lineNumber":195,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":196,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":197,"author":{"gitId":"-"},"content":" public PersonListPanel getPersonListPanel() {","lastModifiedDate":"2016-08-25"},{"lineNumber":198,"author":{"gitId":"-"},"content":" return personListPanel;","lastModifiedDate":"2018-08-14"},{"lineNumber":199,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-25"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":201,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":202,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2018-12-09"},{"lineNumber":203,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-12-09"},{"lineNumber":204,"author":{"gitId":"-"},"content":" * @see seedu.address.logic.Logic#execute(String)","lastModifiedDate":"2018-12-09"},{"lineNumber":205,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":" private CommandResult executeCommand(String commandText) throws CommandException, ParseException {","lastModifiedDate":"2018-12-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2018-12-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":" CommandResult commandResult \u003d logic.execute(commandText);","lastModifiedDate":"2018-12-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":" logger.info(\"Result: \" + commandResult.getFeedbackToUser());","lastModifiedDate":"2018-12-09"},{"lineNumber":210,"author":{"gitId":"-"},"content":" resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser());","lastModifiedDate":"2018-12-09"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":212,"author":{"gitId":"-"},"content":" if (commandResult.isShowHelp()) {","lastModifiedDate":"2018-12-09"},{"lineNumber":213,"author":{"gitId":"-"},"content":" handleHelp();","lastModifiedDate":"2018-12-09"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":" if (commandResult.isExit()) {","lastModifiedDate":"2018-12-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":" handleExit();","lastModifiedDate":"2018-12-09"},{"lineNumber":218,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":220,"author":{"gitId":"RunjiaChen"},"content":" if (commandResult.isAddByStep()) {","lastModifiedDate":"2024-03-07"},{"lineNumber":221,"author":{"gitId":"RunjiaChen"},"content":" handleAddByStep();","lastModifiedDate":"2024-03-07"},{"lineNumber":222,"author":{"gitId":"RunjiaChen"},"content":" }","lastModifiedDate":"2024-03-07"},{"lineNumber":223,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2018-12-09"},{"lineNumber":225,"author":{"gitId":"-"},"content":" } catch (CommandException | ParseException e) {","lastModifiedDate":"2018-12-09"},{"lineNumber":226,"author":{"gitId":"-"},"content":" logger.info(\"An error occurred while executing command: \" + commandText);","lastModifiedDate":"2023-06-13"},{"lineNumber":227,"author":{"gitId":"-"},"content":" resultDisplay.setFeedbackToUser(e.getMessage());","lastModifiedDate":"2018-12-09"},{"lineNumber":228,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2018-12-09"},{"lineNumber":229,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":230,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":231,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-18"}],"authorContributionMap":{"RunjiaChen":36,"-":195}},{"path":"src/main/resources/view/CommandHelperWindow.fxml","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"RunjiaChen"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"RunjiaChen"},"content":"\u003c?import javafx.scene.control.Button?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"RunjiaChen"},"content":"\u003c?import javafx.scene.control.ScrollPane?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"RunjiaChen"},"content":"\u003c?import javafx.scene.control.TextField?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"RunjiaChen"},"content":"\u003c?import javafx.scene.layout.AnchorPane?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"RunjiaChen"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"RunjiaChen"},"content":"\u003cAnchorPane maxHeight\u003d\"-Infinity\" maxWidth\u003d\"-Infinity\" minHeight\u003d\"-Infinity\" minWidth\u003d\"-Infinity\" prefHeight\u003d\"600.0\" prefWidth\u003d\"400.0\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\" fx:controller\u003d\"seedu.address.ui.CommandHelperWindow\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"RunjiaChen"},"content":" \u003cchildren\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"RunjiaChen"},"content":" \u003cTextField fx:id\u003d\"userInput\" layoutY\u003d\"558.0\" onAction\u003d\"#handleUserInput\" prefHeight\u003d\"41.0\" prefWidth\u003d\"324.0\" AnchorPane.bottomAnchor\u003d\"1.0\" /\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"RunjiaChen"},"content":" \u003cButton fx:id\u003d\"sendButton\" layoutX\u003d\"324.0\" layoutY\u003d\"558.0\" mnemonicParsing\u003d\"false\" onAction\u003d\"#handleUserInput\" prefHeight\u003d\"41.0\" prefWidth\u003d\"76.0\" text\u003d\"Send\" /\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"RunjiaChen"},"content":" \u003cScrollPane fx:id\u003d\"scrollPane\" hbarPolicy\u003d\"NEVER\" hvalue\u003d\"1.0\" prefHeight\u003d\"557.0\" prefWidth\u003d\"400.0\" vvalue\u003d\"1.0\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"RunjiaChen"},"content":" \u003ccontent\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"RunjiaChen"},"content":" \u003cVBox fx:id\u003d\"dialogContainer\" prefHeight\u003d\"552.0\" prefWidth\u003d\"388.0\" /\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"RunjiaChen"},"content":" \u003c/content\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"RunjiaChen"},"content":" \u003c/ScrollPane\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"RunjiaChen"},"content":" \u003c/children\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"RunjiaChen"},"content":"\u003c/AnchorPane\u003e","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"RunjiaChen":19}},{"path":"src/main/resources/view/DialogBox.fxml","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"RunjiaChen"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"RunjiaChen"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"RunjiaChen"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"RunjiaChen"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"RunjiaChen"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"RunjiaChen"},"content":"\u003cfx:root alignment\u003d\"TOP_RIGHT\" maxHeight\u003d\"1.7976931348623157E308\" maxWidth\u003d\"1.7976931348623157E308\" prefWidth\u003d\"400.0\" type\u003d\"javafx.scene.layout.HBox\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"RunjiaChen"},"content":" \u003cchildren\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"RunjiaChen"},"content":" \u003cLabel fx:id\u003d\"dialog\" text\u003d\"Label\" wrapText\u003d\"true\" /\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"RunjiaChen"},"content":" \u003c/children\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"RunjiaChen"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"RunjiaChen"},"content":" \u003cInsets bottom\u003d\"15.0\" left\u003d\"5.0\" right\u003d\"5.0\" top\u003d\"15.0\" /\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"RunjiaChen"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"RunjiaChen"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"RunjiaChen":14}}] diff --git a/AY2324S2-CS2103T-T12-2_tp_master/commits.json b/AY2324S2-CS2103T-T12-2_tp_master/commits.json index 313631bb..9dc947b5 100644 --- a/AY2324S2-CS2103T-T12-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T12-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"AidenLYT":[{"date":"2024-02-25","commitResults":[{"hash":"2480e6143ae73bf7f62044d31e7b625036b5c776","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/switch-docs-to-markbind\u0027 Merge for MarkBind","messageBody":"* Merge branch into master\n","fileTypesAndContributionMap":{}},{"hash":"358cac154b99f56cc6af023686bb4cdba40cb8a2","isMergeCommit":false,"messageTitle":"Initiate site","messageBody":"* Follow step-by-step guide\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"4ec171b4da1b83559324fee6eed945be5a111a02","isMergeCommit":false,"messageTitle":"Add my own info file in team folder","messageBody":"* Add AidenLYT.md\n","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":0}}}]},{"date":"2024-03-01","commitResults":[{"hash":"96d086c3f0a438af8ceea469260c90bbd373ede9","isMergeCommit":false,"messageTitle":"Edit use cases to fit LookMeUp","messageBody":"* UC1 - Add\n* UC2 - Remove\n* UC3 - Filter\n* UC4 - Sort\n","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":12}}}]},{"date":"2024-03-07","commitResults":[{"hash":"b2e23d1aedb1732bb73c4223f8abb2330dbf821f","isMergeCommit":true,"messageTitle":"Merge pull request #21 from kervyntan/master","messageBody":"Updated DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"9b6d2730b062986946b55e23aef55ed28f2f11b7","isMergeCommit":true,"messageTitle":"Merge pull request #23 from smolegz/add-AboutUs","messageBody":"Add AboutUs page","fileTypesAndContributionMap":{}}]}],"RunjiaChen":[],"smolegz":[{"date":"2024-03-03","commitResults":[{"hash":"057363f1ee9d3d8e96118b21c69f334845e0cf32","isMergeCommit":true,"messageTitle":"Merge pull request #18 from AidenLYT/add-AidenLYT-info","messageBody":"Add my own info file in team folder","fileTypesAndContributionMap":{}},{"hash":"3c9b7aea4617256795fdb1bbe2245ea875e5f72f","isMergeCommit":false,"messageTitle":"Add AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":26}}},{"hash":"9b6a2e705ed6ddeee225467c035151ba748027c3","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":13}}},{"hash":"63b16612f78949131dc2ec0f056299600af4bef7","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"4b2e0e4f97fe7ed2cb98265186801a432ada4d6c","isMergeCommit":false,"messageTitle":"Fix naming convention for AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"774f15d4a82c328dc47f28fc1d72eeb7b75367ad","isMergeCommit":true,"messageTitle":"Merge pull request #19 from AidenLYT/edit-DeveloperGuide-UseCases","messageBody":"Edit use cases to fit LookMeUp","fileTypesAndContributionMap":{}}]}],"lynnetteeee":[],"kervyntan":[{"date":"2024-03-06","commitResults":[{"hash":"01cce2f5aed6daacd6fdd93b9f8bb3c79cd1c867","isMergeCommit":false,"messageTitle":"Updated DeveloperGuide.md","messageBody":"Added User Profile, Value Proposition and User stories.\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":13}}}]}]},"authorFileTypeContributionMap":{"AidenLYT":{"docs":130,"functional-code":0,"test-code":0},"RunjiaChen":{"docs":0,"functional-code":0,"test-code":0},"smolegz":{"docs":42,"functional-code":0,"test-code":0},"lynnetteeee":{"docs":0,"functional-code":0,"test-code":0},"kervyntan":{"docs":8,"functional-code":0,"test-code":0}},"authorContributionVariance":{"AidenLYT":755.1226,"RunjiaChen":0.0,"smolegz":743.1022,"lynnetteeee":0.0,"kervyntan":29.25},"authorDisplayNameMap":{"AidenLYT":"CS2103T-T12-2 LEE ..TING","RunjiaChen":"CS2103T-T12-2 CHEN..NJIA","smolegz":"CS2103T-T12-2 KOO .. HUI","lynnetteeee":"CS2103T-T12-2 ONG ..ETTE","kervyntan":"CS2103T-T12-2 KERV..AWEI"}} +{"authorDailyContributionsMap":{"AidenLYT":[{"date":"2024-02-25","commitResults":[{"hash":"2480e6143ae73bf7f62044d31e7b625036b5c776","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/switch-docs-to-markbind\u0027 Merge for MarkBind","messageBody":"* Merge branch into master\n","fileTypesAndContributionMap":{}},{"hash":"358cac154b99f56cc6af023686bb4cdba40cb8a2","isMergeCommit":false,"messageTitle":"Initiate site","messageBody":"* Follow step-by-step guide\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"4ec171b4da1b83559324fee6eed945be5a111a02","isMergeCommit":false,"messageTitle":"Add my own info file in team folder","messageBody":"* Add AidenLYT.md\n","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":0}}}]},{"date":"2024-03-01","commitResults":[{"hash":"96d086c3f0a438af8ceea469260c90bbd373ede9","isMergeCommit":false,"messageTitle":"Edit use cases to fit LookMeUp","messageBody":"* UC1 - Add\n* UC2 - Remove\n* UC3 - Filter\n* UC4 - Sort\n","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":12}}}]},{"date":"2024-03-07","commitResults":[{"hash":"b2e23d1aedb1732bb73c4223f8abb2330dbf821f","isMergeCommit":true,"messageTitle":"Merge pull request #21 from kervyntan/master","messageBody":"Updated DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"9b6d2730b062986946b55e23aef55ed28f2f11b7","isMergeCommit":true,"messageTitle":"Merge pull request #23 from smolegz/add-AboutUs","messageBody":"Add AboutUs page","fileTypesAndContributionMap":{}},{"hash":"f8e599b4fd3298e397255791adb155327bc82804","isMergeCommit":true,"messageTitle":"Merge pull request #20 from smolegz/add-KooZhuoHui-info","messageBody":"Add KooZhuoHui.md","fileTypesAndContributionMap":{}},{"hash":"770a4208ca3e747f53e73c8da88df4eb63770138","isMergeCommit":true,"messageTitle":"Merge pull request #28 from lynnetteeee/master","messageBody":"Add OngXinHuiLynnette.md","fileTypesAndContributionMap":{}},{"hash":"880c5196651fe79d2ea946ce3005bc0f82e75d90","isMergeCommit":true,"messageTitle":"Merge pull request #27 from kervyntan/master","messageBody":"Tutorial Adding command","fileTypesAndContributionMap":{}},{"hash":"e2eab294347f6a7ac47b6db1dc106bc4cff45d6a","isMergeCommit":false,"messageTitle":"Revert \"Tutorial Adding command\"","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":37,"deletions":264},"docs":{"insertions":0,"deletions":10},"test-code":{"insertions":16,"deletions":113}}},{"hash":"64e91ce8682b848cd67224fbe07e945a58a9bf10","isMergeCommit":true,"messageTitle":"Merge pull request #26 from RunjiaChen/master","messageBody":"Update DG ","fileTypesAndContributionMap":{}},{"hash":"0de82422ec1280fd8326409171ef3dcbe6069732","isMergeCommit":true,"messageTitle":"Merge pull request #29 from lynnetteeee/master","messageBody":"Update README ","fileTypesAndContributionMap":{}},{"hash":"8a73ffbcbfa5109a3cbeb822fb73ea4830b1ce61","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into revert-27-master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"022f6ff5863ab9e1e60dd54cb3cfb0cd08d48544","isMergeCommit":true,"messageTitle":"Merge pull request #30 from AY2324S2-CS2103T-T12-2/revert-27-master","messageBody":"Revert \"Tutorial Adding command\"","fileTypesAndContributionMap":{}}]}],"RunjiaChen":[{"date":"2024-03-07","commitResults":[{"hash":"4e61f6818643ad51865f54ec512ed715b19a6615","isMergeCommit":false,"messageTitle":"Add skeletion code for Add Command Helper","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":233,"deletions":10},"docs":{"insertions":4,"deletions":0}}},{"hash":"c1e0ecf48cbde8a4dd984865be637c8e34d5b016","isMergeCommit":false,"messageTitle":"Add skeletion code for Add Command Helper","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":233,"deletions":10},"docs":{"insertions":4,"deletions":0}}},{"hash":"efca9f89dc64c89928a319213a0624fd16a27e3a","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Branch-AddByStep","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"d3da61be433a60a44685eb7bec087e98032b16fa","isMergeCommit":false,"messageTitle":"Add new NFRs and terms to glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":1}}},{"hash":"9eac8823ee98942ccf5d3fb31663bdd59f446689","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}}]}],"smolegz":[{"date":"2024-03-03","commitResults":[{"hash":"106beefec3bf5ccfce41b33871fc3bf664203764","isMergeCommit":false,"messageTitle":"Add ZhuoHui.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":0}}},{"hash":"057363f1ee9d3d8e96118b21c69f334845e0cf32","isMergeCommit":true,"messageTitle":"Merge pull request #18 from AidenLYT/add-AidenLYT-info","messageBody":"Add my own info file in team folder","fileTypesAndContributionMap":{}},{"hash":"3c9b7aea4617256795fdb1bbe2245ea875e5f72f","isMergeCommit":false,"messageTitle":"Add AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":26}}},{"hash":"9b6a2e705ed6ddeee225467c035151ba748027c3","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":13}}},{"hash":"63b16612f78949131dc2ec0f056299600af4bef7","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"4b2e0e4f97fe7ed2cb98265186801a432ada4d6c","isMergeCommit":false,"messageTitle":"Fix naming convention for AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"774f15d4a82c328dc47f28fc1d72eeb7b75367ad","isMergeCommit":true,"messageTitle":"Merge pull request #19 from AidenLYT/edit-DeveloperGuide-UseCases","messageBody":"Edit use cases to fit LookMeUp","fileTypesAndContributionMap":{}}]}],"lynnetteeee":[{"date":"2024-03-07","commitResults":[{"hash":"e72efbc29e040b59e20153c3ecc6c289d605cade","isMergeCommit":false,"messageTitle":"Add personal info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}},{"hash":"c20e3b7ecc6e386853a167644c94ecc4618e94d8","isMergeCommit":true,"messageTitle":"Merge branch \u0027add-OngXinHuiLynnette-info\u0027","messageBody":"* add-OngXinHuiLynnette-info:\n Add personal info\n","fileTypesAndContributionMap":{}},{"hash":"bdf81ca2cdfe733923ff48c903f7f8440d1f02ab","isMergeCommit":false,"messageTitle":"Update README to match LookMeUp project Add Ui mockup with NUS theme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":11}}},{"hash":"09d774c099265a8379dde5bd184b8537d058931b","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-update-readme\u0027","messageBody":"* branch-update-readme:\n Update README to match LookMeUp project Add Ui mockup with NUS theme\n","fileTypesAndContributionMap":{}}]}],"kervyntan":[{"date":"2024-03-06","commitResults":[{"hash":"01cce2f5aed6daacd6fdd93b9f8bb3c79cd1c867","isMergeCommit":false,"messageTitle":"Updated DeveloperGuide.md","messageBody":"Added User Profile, Value Proposition and User stories.\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":13}}}]},{"date":"2024-03-07","commitResults":[{"hash":"69e703de40603a091bff098b092f03d70b757e60","isMergeCommit":false,"messageTitle":"Added new files to codebase","messageBody":"Partially completed tutorial on adding command.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":98,"deletions":0}}},{"hash":"d2fa9c16634fd69c81fb5dfc88c8ae67827718bb","isMergeCommit":false,"messageTitle":"Added files to implement Remark command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":171,"deletions":42},"test-code":{"insertions":113,"deletions":16}}},{"hash":"8b5cf7e77d77c3e25f2ce531f26aaac93ce63297","isMergeCommit":false,"messageTitle":"Added KervynTanJiawei.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}},{"hash":"10715fccdf88e068ec4253bdd1c3e53ebcf80247","isMergeCommit":false,"messageTitle":"Added newline in KervynTanJiawei.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]},{"date":"2024-03-08","commitResults":[{"hash":"2536283e82ed1928e78fc58a48c2ae46951c9ed6","isMergeCommit":false,"messageTitle":"Updated KervynTanJiawei.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":0}}},{"hash":"36c9acd2b8c8197bdd97f39df9fb6bc26a16959b","isMergeCommit":false,"messageTitle":"Added trailing whitespaces","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":3,"deletions":3},"docs":{"insertions":2,"deletions":2}}},{"hash":"767968f8a7ca7c041c009f4d721e1c04755e1a0b","isMergeCommit":false,"messageTitle":"Added whitespace","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"0dc2e70b2c3ca30690cb79dd85685374def6570e","isMergeCommit":true,"messageTitle":"Merge pull request #34 from kervyntan/master","messageBody":"Updated KervynTanJiawei.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"AidenLYT":{"docs":130,"functional-code":0,"test-code":0},"RunjiaChen":{"docs":7,"functional-code":233,"test-code":0},"smolegz":{"docs":48,"functional-code":0,"test-code":0},"lynnetteeee":{"docs":35,"functional-code":0,"test-code":0},"kervyntan":{"docs":15,"functional-code":0,"test-code":0}},"authorContributionVariance":{"AidenLYT":12163.849,"RunjiaChen":15493.3955,"smolegz":778.77325,"lynnetteeee":137.4489,"kervyntan":12597.894},"authorDisplayNameMap":{"AidenLYT":"CS2103T-T12-2 LEE ..TING","RunjiaChen":"CS2103T-T12-2 CHEN..NJIA","smolegz":"CS2103T-T12-2 KOO .. HUI","lynnetteeee":"CS2103T-T12-2 ONG ..ETTE","kervyntan":"CS2103T-T12-2 KERV..AWEI"}} diff --git a/AY2324S2-CS2103T-T12-4_tp_master/authorship.json b/AY2324S2-CS2103T-T12-4_tp_master/authorship.json index 26c70875..0b21b9f2 100644 --- a/AY2324S2-CS2103T-T12-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T12-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T12-4/tp/graph/badge.svg?token\u003d2O08Y4YRPC)](https://codecov.io/gh/AY2324S2-CS2103T-T12-4/tp)","lastModifiedDate":"2024-02-22"},{"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":"linnn-7"},"content":"* The project simulates an ongoing software project for a desktop application used for managing employee details.","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"* It is named `PayBack` because it mainly keeps track of a company\u0027s financial details with its employees.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"linnn-7"},"content":"* This project is based on the project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"linnn-7":3,"-":10}},{"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":"DhiraPT"},"content":"### Dhiraputta Pathama Tengara","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"DhiraPT"},"content":"\u003cimg src\u003d\"images/dhirapt.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"DhiraPT"},"content":"[[homepage](https://dhirapt-portfolio.vercel.app)]","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"DhiraPT"},"content":"[[github](https://github.com/DhiraPT)]","lastModifiedDate":"2024-02-27"},{"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":"linnn-7"},"content":"### Lin Bin","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"linnn-7"},"content":"\u003cimg src\u003d\"images/linnn-7.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"linnn-7"},"content":"[[github](http://github.com/linnn-7)]","lastModifiedDate":"2024-02-28"},{"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: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"ondretann"},"content":"### Ondre Tann","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ondretann"},"content":"\u003cimg src\u003d\"images/ondretann.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"ondretann"},"content":"[[github](http://github.com/ondretann)]","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"PateShin"},"content":"### Shin Dong Yoon","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"PateShin"},"content":"\u003cimg src\u003d\"images/pateshin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"PateShin"},"content":"[[github](https://github.com/PateShin)]","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"linnn-7":3,"PateShin":3,"DhiraPT":4,"-":37,"ondretann":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":"linnn-7"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"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/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"**API** : [`Logic.java`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"**API** : [`Model.java`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"**API** : [`Storage.java`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"Classes used by multiple components are in the `seedu.address.commons` package.","lastModifiedDate":"2024-03-06"},{"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":"ondretann"},"content":"* is a company manager","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"ondretann"},"content":"* has a need to manage a significant number of employees","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"ondretann"},"content":"* is required to handle a multitude of financial transactions (such as salary crediting, loans, etc)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"**Value proposition**: manage employee information more efficiently and clearly than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-06"},{"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":"PateShin"},"content":"| -------- |---------------------|---------------------------------------------|----------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"PateShin"},"content":"| `* * *` | New Company Manager | read the instructions of the program | Learn or remember the lists of commands or methods to use the system |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"PateShin"},"content":"| `* * *` | Company Manager | add a new employee | ensure they are officially recorded |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"PateShin"},"content":"| `* * *` | Company Manager | remove/delete a employee | have an updated list of employees when they leave the company |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"PateShin"},"content":"| `* * *` | Company Manager | find a employee by ID, name, phone or email | retrieve details of employee(s) without looking entire workers |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"PateShin"},"content":"| `* *` | Company Manager | edit information of a employee | rectify any incorrect inputs entered into the system |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"PateShin"},"content":"| `* *` | Company Manager | list entire employees | see entire employees |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"PateShin"},"content":"| `*` | Company Manager | create a tag to employee | recognize all types of attention |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"PateShin"},"content":"(For all use cases below, the **System** is the `PayBack` and the **Actor** is the `Company Manager`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"DhiraPT"},"content":"**Use case: Add a new employee**","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"DhiraPT"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"DhiraPT"},"content":"1. User requests to add a new employee","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"DhiraPT"},"content":"2. User enters the name, phone number, email, and optionally, year joined","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"DhiraPT"},"content":"3. PayBack adds the new employee to the employee list","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"DhiraPT"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"DhiraPT"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"DhiraPT"},"content":"* 2a. The fields other than the year joined are not specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"DhiraPT"},"content":" * 2a1. PayBack shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"DhiraPT"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"DhiraPT"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"DhiraPT"},"content":"* 2b. The parameters are not specified in the correct order.","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"DhiraPT"},"content":" * 2b1. PayBack shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"DhiraPT"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"DhiraPT"},"content":"* 2c. Some parameters are specified, some are not.","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"DhiraPT"},"content":" * 2c1. PayBack shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"DhiraPT"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"DhiraPT"},"content":"* 2d. The information entered is not in the correct format.","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"DhiraPT"},"content":" * 2d1. PayBack shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"DhiraPT"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"ondretann"},"content":"**Use case: Remove a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"ondretann"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"ondretann"},"content":"1. User requests to remove an employee","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"ondretann"},"content":"2. User enters employee ID","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"ondretann"},"content":"3. Payback displays details of the employee for confirmation","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"ondretann"},"content":"4. User confirms removal of employee","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"ondretann"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"ondretann"},"content":"**Extension**","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"ondretann"},"content":"* 2a. Employee ID entered is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"ondretann"},"content":" * 2a1. Payback shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"ondretann"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"ondretann"},"content":"* 4a. User cancels the removal of employee.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"ondretann"},"content":" * 4a1. Payback acknowledges the cancellation.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"ondretann"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"ondretann"},"content":"**Use case: Tag a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"ondretann"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"ondretann"},"content":"1. User requests to tag an employee","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"ondretann"},"content":"2. User enters employee id and tags","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"ondretann"},"content":"3. Payback displays details of the employee and tags to be added for confirmation","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"ondretann"},"content":"4. User confirms tagging of employee","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"ondretann"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"ondretann"},"content":"**Extension**","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"ondretann"},"content":"* 2a. Employee ID entered is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"ondretann"},"content":" * 2a1. Payback shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"ondretann"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"ondretann"},"content":"* 2b. Tag parameter(s) is/are not specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"ondretann"},"content":" * 2b1. Payback shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"ondretann"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"ondretann"},"content":"* 4a. User cancels tagging of employee.","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"ondretann"},"content":" * 4a1. Payback acknowledges the cancellation.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"ondretann"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"PateShin"},"content":"**Use case: Find a person**","lastModifiedDate":"2024-03-06"},{"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":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"PateShin"},"content":"2. PayBack shows a list of employees","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"PateShin"},"content":"3. User requests to find a specific employee in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"PateShin"},"content":"4. PayBack finds the employee","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"PateShin"},"content":"* 3a. The given entered format is incorrect.","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"PateShin"},"content":" * 3a1. PayBack shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"PateShin"},"content":"* 3b. There are no employees found.","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"PateShin"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"PateShin"},"content":" * 3b1. PayBack shows a not found message.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"PateShin"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"PateShin"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"PateShin"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"PateShin"},"content":"**Use case: List entire employees**","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"linnn-7"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"PateShin"},"content":"1. User requests to list employees","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"PateShin"},"content":"2. PayBack shows a list of employees","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"linnn-7"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"linnn-7"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"PateShin"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"linnn-7"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"linnn-7"},"content":"**Use case: Edit an employee**","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"linnn-7"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":435,"author":{"gitId":"linnn-7"},"content":"1. User requests to edit an employee\u0027s information","lastModifiedDate":"2024-03-06"},{"lineNumber":436,"author":{"gitId":"linnn-7"},"content":"2. User enters the employee\u0027s ID and fields that need to be updated","lastModifiedDate":"2024-03-06"},{"lineNumber":437,"author":{"gitId":"linnn-7"},"content":"3. PayBack changes the employee\u0027s information accordingly","lastModifiedDate":"2024-03-06"},{"lineNumber":438,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":439,"author":{"gitId":"linnn-7"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":441,"author":{"gitId":"linnn-7"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":442,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":443,"author":{"gitId":"linnn-7"},"content":"* 2a. The ID is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":444,"author":{"gitId":"linnn-7"},"content":" * 2a1. PayBack shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":445,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"linnn-7"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":448,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"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":451,"author":{"gitId":"linnn-7"},"content":"2. Should be able to hold up to 1000 employees without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":452,"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":453,"author":{"gitId":"linnn-7"},"content":"4. The system should provide real-time access to employee information with response times not exceeding 2 seconds for any query.","lastModifiedDate":"2024-03-06"},{"lineNumber":454,"author":{"gitId":"linnn-7"},"content":"5. The app should have an intuitive user interface, allowing users to easily navigate and perform tasks without extensive training.","lastModifiedDate":"2024-03-06"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"DhiraPT"},"content":"* **Actor**: A user or any other system that interacts with the system being described","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"DhiraPT"},"content":"* **API**: Abbreviation for Application Programming Interface, a set of rules and protocols that allows different software applications to communicate with each other","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"DhiraPT"},"content":"* **Aspect**: A particular feature or consideration that needs to be taken into account when designing or implementing a system","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"DhiraPT"},"content":"* **CLI**: Abbreviation for Command Line Interface, a text-based interface used for entering commands to interact with the application","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"DhiraPT"},"content":"* **DevOps**: A set of practices that combines software development (Dev) and IT operations (Ops), aimed at shortening the systems development life cycle and providing continuous delivery with high software quality","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"DhiraPT"},"content":"* **GUI**: Abbreviation for Graphical User Interface, a type of user interface that allows users to interact with the application through graphical icons and visual indicators, as opposed to text-based interfaces like command-line interfaces (CLI)","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"DhiraPT"},"content":"* **JSON**: Abbreviation for JavaScript Object Notation, a lightweight data-interchange format that uses key-value pairs","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":466,"author":{"gitId":"DhiraPT"},"content":"* **MSS**: Abbreviation for Main Success Scenario, the main flow of events in a use case","lastModifiedDate":"2024-03-07"},{"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":"DhiraPT"},"content":"* **Tag**: A label or identifier associated with a particular record or entity in the application","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"DhiraPT"},"content":"* **UI**: Abbreviation for User Interface, refers to the interface through which users interact with the application","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"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":478,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"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":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"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":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"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":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"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":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"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":512,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"linnn-7":38,"PateShin":25,"DhiraPT":46,"-":352,"ondretann":61}},{"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":"linnn-7"},"content":"PayBack 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, PayBack can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-02-28"},{"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":"linnn-7"},"content":"1. Download the latest `payback.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"linnn-7"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your application.","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"linnn-7"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar payback.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":" * `/list` : Lists all contacts.","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"linnn-7"},"content":" * `/new jennie, 12334546, 123@gmail.com, 2021` : Adds a contact named `jennie` to the Address Book.","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"linnn-7"},"content":" * `/remove 240001` : Deletes the contact with id 240001.","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","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":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"linnn-7"},"content":" e.g. in `/new NAME`, `NAME` is a parameter which can be used as `/new John Doe`.","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"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":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"ondretann"},"content":"* Items with `…`​ after them can be used multiple times at least onxe.\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"ondretann"},"content":" e.g. `[t/TAG]…​` can be used as `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2024-02-28"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"DhiraPT"},"content":"* Parameters can be in any order, if specified.\u003cbr\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":54,"author":{"gitId":"DhiraPT"},"content":" e.g. if the command specifies `:name :phone`, `:phone :name` is also acceptable.","lastModifiedDate":"2024-02-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"linnn-7"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `/help`, `/list`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Format: `help`","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":"DhiraPT"},"content":"### Adding a new employee: `/new`","lastModifiedDate":"2024-02-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"DhiraPT"},"content":"Adds a new employee to the address book.","lastModifiedDate":"2024-02-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"DhiraPT"},"content":"Format:","lastModifiedDate":"2024-02-27"},{"lineNumber":76,"author":{"gitId":"DhiraPT"},"content":"* `/new NAME, PHONE_NUMBER, EMAIL, [YEAR_JOINED]`","lastModifiedDate":"2024-02-27"},{"lineNumber":77,"author":{"gitId":"DhiraPT"},"content":"* `/new :name NAME :phone PHONE_NUMBER :email EMAIL [:year YEAR_JOINED]`","lastModifiedDate":"2024-02-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"DhiraPT"},"content":"* `/new jennie, 12334546, 123@gmail.com, 2021`","lastModifiedDate":"2024-02-27"},{"lineNumber":81,"author":{"gitId":"DhiraPT"},"content":"* `/new :name jennie :phone 12334546 :email 123@gmail.com :year 2021`","lastModifiedDate":"2024-02-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"PateShin"},"content":"Show workers as a list. This can be used as “refresh” (e.g. after find command)","lastModifiedDate":"2024-02-28"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"PateShin"},"content":"**Format:** `list`","lastModifiedDate":"2024-02-28"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"linnn-7"},"content":"### Editing a person : `/edit`","lastModifiedDate":"2024-02-28"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"linnn-7"},"content":"Edits an existing employee in the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"linnn-7"},"content":"Format: `/edit ID [:name NAME] [:phone PHONE] [:email EMAIL] [:tag TAG]`","lastModifiedDate":"2024-02-28"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"linnn-7"},"content":"* Edits the person of the specified `ID`. The id refers to the 6-digits identity number. The id **must be 6 digits**: 240001, 240002...","lastModifiedDate":"2024-02-28"},{"lineNumber":96,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"linnn-7"},"content":"* When editing tags, all the existing tags of the person will be removed.","lastModifiedDate":"2024-02-28"},{"lineNumber":99,"author":{"gitId":"linnn-7"},"content":"* You can remove all the person’s tags by typing `:tag` without","lastModifiedDate":"2024-02-28"},{"lineNumber":100,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"linnn-7"},"content":"* `/edit 240001 :phone 91234567 :email: johndoe@example.com` Edits the phone number and email address of the person with id 240001 to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-02-28"},{"lineNumber":104,"author":{"gitId":"linnn-7"},"content":"* `/edit 240002 :name Betsy Crower :tag` Edits the name of the person with id 240002 to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-02-28"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"PateShin"},"content":"### Searching Workers by keyword: `find`","lastModifiedDate":"2024-02-28"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"PateShin"},"content":"Finds workers that contains any of the given keywords. It can be `ID`, `NAME`, `EMAIL` or `PHONE NUMBER`.","lastModifiedDate":"2024-02-28"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"PateShin"},"content":"**Format:**","lastModifiedDate":"2024-02-28"},{"lineNumber":111,"author":{"gitId":"PateShin"},"content":"* `Find by name: /find :name [name]`","lastModifiedDate":"2024-02-28"},{"lineNumber":112,"author":{"gitId":"PateShin"},"content":"* `Find by email: /find :email [email]`","lastModifiedDate":"2024-02-28"},{"lineNumber":113,"author":{"gitId":"PateShin"},"content":"* `Find by phone number: /find :phone [phone number]`","lastModifiedDate":"2024-02-28"},{"lineNumber":114,"author":{"gitId":"PateShin"},"content":"* `Find by worker’s ID: /find :ID [ID]`","lastModifiedDate":"2024-02-28"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"PateShin"},"content":"**Acceptable Format:**","lastModifiedDate":"2024-02-28"},{"lineNumber":117,"author":{"gitId":"PateShin"},"content":"* _Any letter cases are acceptable. e.g `Patrick` will match `patrick`_","lastModifiedDate":"2024-02-28"},{"lineNumber":118,"author":{"gitId":"PateShin"},"content":"* _ID: must be 6 digits of numbers_","lastModifiedDate":"2024-02-28"},{"lineNumber":119,"author":{"gitId":"PateShin"},"content":"* _Name: can be any case (Strings)_","lastModifiedDate":"2024-02-28"},{"lineNumber":120,"author":{"gitId":"PateShin"},"content":"* _Phone: must be numbers (integers)_","lastModifiedDate":"2024-02-28"},{"lineNumber":121,"author":{"gitId":"PateShin"},"content":"* _Email: must include “@”_","lastModifiedDate":"2024-02-28"},{"lineNumber":122,"author":{"gitId":"PateShin"},"content":"* _Only full keywords will be matched. e.g `Patrick` will not match `patr`_","lastModifiedDate":"2024-02-28"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"linnn-7"},"content":"* `/find :name John` returns `john` and `John Doe`","lastModifiedDate":"2024-03-06"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"linnn-7"},"content":"Format: `/remove ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"ondretann"},"content":"* Deletes the person with the specified `ID`.","lastModifiedDate":"2024-02-28"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"ondretann"},"content":"* `/remove 240001` deletes the person with `240001` ID.","lastModifiedDate":"2024-02-28"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":138,"author":{"gitId":"ondretann"},"content":"### Tagging a person: `tag`","lastModifiedDate":"2024-02-28"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":140,"author":{"gitId":"ondretann"},"content":"Tags the specified person from the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":142,"author":{"gitId":"ondretann"},"content":"Format: `/tag ID t/TAG...`","lastModifiedDate":"2024-02-28"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"ondretann"},"content":"* Tags the person with the specified `ID`.","lastModifiedDate":"2024-02-28"},{"lineNumber":145,"author":{"gitId":"ondretann"},"content":"* Allowed to have more than 1 tags per person.","lastModifiedDate":"2024-02-28"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"ondretann"},"content":"* `/tag 240001 t/finance t/manager` tags the person with `240001` ID with `finance` and `manager`.","lastModifiedDate":"2024-02-28"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"linnn-7"},"content":"PayBack 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-06"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":156,"author":{"gitId":"linnn-7"},"content":"PayBack data are saved automatically as a JSON file `[JAR file location]/data/payback.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":158,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":159,"author":{"gitId":"linnn-7"},"content":"If modifications to the data file result in an invalid format, PayBack will discard all data and initiate the next run with an empty data file. ","lastModifiedDate":"2024-03-06"},{"lineNumber":160,"author":{"gitId":"linnn-7"},"content":"Therefore, it is advisable to create a backup of the file before making any edits. ","lastModifiedDate":"2024-03-06"},{"lineNumber":161,"author":{"gitId":"linnn-7"},"content":"Additionally, specific changes may lead to unexpected behavior in PayBack, such as if a value entered falls outside the acceptable range. Hence, proceed with editing the data file only if you are certain that you can make accurate updates.","lastModifiedDate":"2024-03-06"},{"lineNumber":162,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":167,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"linnn-7"},"content":"## Q\u0026A","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"linnn-7"},"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 PayBack home folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":178,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":180,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":182,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":183,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2024-03-06"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":185,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"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":"2024-03-06"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":188,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":189,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-06"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":191,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":192,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"linnn-7"},"content":"**New** | `/new :name NAME :phone PHONE :email EMAIL [year joined] \u003cbr\u003e e.g., `/new jennie, 12334546, 123@gmail.com, 2021`","lastModifiedDate":"2024-03-06"},{"lineNumber":197,"author":{"gitId":"linnn-7"},"content":"**Delete** | `/remove ID`\u003cbr\u003e e.g., `/remove 240001`","lastModifiedDate":"2024-03-06"},{"lineNumber":198,"author":{"gitId":"linnn-7"},"content":"**Edit** | `/edit ID [:name NAME] [:phone PHONE] [:email EMAIL] [:tag TAG]`\u003cbr\u003e e.g.,`/edit 240001 :phone 91234567 :email: johndoe@example.com`","lastModifiedDate":"2024-03-06"},{"lineNumber":199,"author":{"gitId":"linnn-7"},"content":"**Find** | `/find :KEYWORD [KEYWORDS]`\u003cbr\u003e e.g., `find :name John`","lastModifiedDate":"2024-03-06"},{"lineNumber":200,"author":{"gitId":"linnn-7"},"content":"**List** | `/list`","lastModifiedDate":"2024-03-06"},{"lineNumber":201,"author":{"gitId":"linnn-7"},"content":"**Help** | `/help`","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"linnn-7":41,"PateShin":16,"DhiraPT":9,"-":125,"ondretann":10}},{"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":"linnn-7"},"content":" content: \"PayBack\";","lastModifiedDate":"2024-02-28"},{"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":{"linnn-7":1,"-":294}},{"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":"linnn-7"},"content":"title: PayBack","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":"linnn-7"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T12-4/tp/graph/badge.svg?token\u003d2O08Y4YRPC)](https://codecov.io/gh/AY2324S2-CS2103T-T12-4/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"linnn-7"},"content":"**PayBack is a desktop application for managing your employee details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"linnn-7"},"content":"* If you are interested in using PayBack, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"linnn-7"},"content":"* If you are interested about developing PayBack, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"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":{"linnn-7":5,"-":12}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"linnn-7"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T12-4/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T12-4/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T12-4/tp/graph/badge.svg?token\u003d2O08Y4YRPC)](https://codecov.io/gh/AY2324S2-CS2103T-T12-4/tp)","lastModifiedDate":"2024-02-22"},{"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":"linnn-7"},"content":"# PayBack","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"linnn-7"},"content":"PayBack is a comprehensive financial management application designed to streamline and simplify financial tracking between a company manager and its employees. ","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"linnn-7"},"content":"With PayBack, the manager can efficiently manage financial transactions, reimbursements, salaries, and other financial interactions with his/her employees.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"linnn-7"},"content":"* It is named `PayBack` because it mainly keeps track of a company\u0027s financial details with its employees.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"linnn-7"},"content":"* This project is based on the project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"linnn-7"},"content":"## Getting Started","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"linnn-7"},"content":"1. Ensure that Java 11 or above is available on your computer.","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"linnn-7"},"content":"2. Download the **payback.jar** file from here.","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"linnn-7"},"content":"3. Open your terminal and navigate to the file\u0027s location.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"linnn-7"},"content":"4. Run the jar file with the follow command","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"linnn-7"},"content":"```shell","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"linnn-7"},"content":"java -jar payback.jar","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"linnn-7"},"content":"```","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"linnn-7"},"content":"## Contact","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"linnn-7"},"content":"For any inquiries or support, please contact `e0969732@u.nus.edu`.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"linnn-7":21,"-":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":"DhiraPT"},"content":"### Dhiraputta Pathama Tengara","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"DhiraPT"},"content":"\u003cimg src\u003d\"images/dhirapt.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"DhiraPT"},"content":"[[homepage](https://dhirapt-portfolio.vercel.app)]","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"DhiraPT"},"content":"[[github](https://github.com/DhiraPT)]","lastModifiedDate":"2024-02-27"},{"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":"linnn-7"},"content":"### Lin Bin","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"linnn-7"},"content":"\u003cimg src\u003d\"images/linnn-7.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"linnn-7"},"content":"[[github](http://github.com/linnn-7)]","lastModifiedDate":"2024-02-28"},{"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: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"ondretann"},"content":"### Ondre Tann","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ondretann"},"content":"\u003cimg src\u003d\"images/ondretann.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"ondretann"},"content":"[[github](http://github.com/ondretann)]","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"PateShin"},"content":"### Shin Dong Yoon","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"PateShin"},"content":"\u003cimg src\u003d\"images/pateshin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"PateShin"},"content":"[[github](https://github.com/PateShin)]","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"linnn-7":3,"PateShin":3,"DhiraPT":4,"-":37,"ondretann":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":"linnn-7"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"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/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"**API** : [`Logic.java`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"**API** : [`Model.java`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"**API** : [`Storage.java`](https://github.com/AY2324S2-CS2103T-T12-4/tp/blob/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"Classes used by multiple components are in the `seedu.address.commons` package.","lastModifiedDate":"2024-03-06"},{"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":"ondretann"},"content":"* is a company manager","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"ondretann"},"content":"* has a need to manage a significant number of employees","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"ondretann"},"content":"* is required to handle a multitude of financial transactions (such as salary crediting, loans, etc)","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":"**Value proposition**: manage employee information more efficiently and clearly than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-06"},{"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":"PateShin"},"content":"| -------- |---------------------|---------------------------------------------|----------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"PateShin"},"content":"| `* * *` | New Company Manager | read the instructions of the program | Learn or remember the lists of commands or methods to use the system |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"PateShin"},"content":"| `* * *` | Company Manager | add a new employee | ensure they are officially recorded |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"PateShin"},"content":"| `* * *` | Company Manager | remove/delete a employee | have an updated list of employees when they leave the company |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"PateShin"},"content":"| `* * *` | Company Manager | find a employee by ID, name, phone or email | retrieve details of employee(s) without looking entire workers |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"PateShin"},"content":"| `* *` | Company Manager | edit information of a employee | rectify any incorrect inputs entered into the system |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"PateShin"},"content":"| `* *` | Company Manager | list entire employees | see entire employees |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"PateShin"},"content":"| `*` | Company Manager | create a tag to employee | recognize all types of attention |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"PateShin"},"content":"(For all use cases below, the **System** is the `PayBack` and the **Actor** is the `Company Manager`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"DhiraPT"},"content":"**Use case: Add a new employee**","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"DhiraPT"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"DhiraPT"},"content":"1. User requests to add a new employee","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"DhiraPT"},"content":"2. User enters the name, phone number, email, and optionally, year joined","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"DhiraPT"},"content":"3. PayBack adds the new employee to the employee list","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"DhiraPT"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"DhiraPT"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"DhiraPT"},"content":"* 2a. The fields other than the year joined are not specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"DhiraPT"},"content":" * 2a1. PayBack shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"DhiraPT"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"DhiraPT"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"DhiraPT"},"content":"* 2b. The parameters are not specified in the correct order.","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"DhiraPT"},"content":" * 2b1. PayBack shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"DhiraPT"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"DhiraPT"},"content":"* 2c. Some parameters are specified, some are not.","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"DhiraPT"},"content":" * 2c1. PayBack shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"DhiraPT"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"DhiraPT"},"content":"* 2d. The information entered is not in the correct format.","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"DhiraPT"},"content":" * 2d1. PayBack shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"DhiraPT"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"DhiraPT"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"ondretann"},"content":"**Use case: Remove a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"ondretann"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"ondretann"},"content":"1. User requests to remove an employee","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"ondretann"},"content":"2. User enters employee ID","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"ondretann"},"content":"3. Payback displays details of the employee for confirmation","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"ondretann"},"content":"4. User confirms removal of employee","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"ondretann"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"ondretann"},"content":"**Extension**","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"ondretann"},"content":"* 2a. Employee ID entered is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"ondretann"},"content":" * 2a1. Payback shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"ondretann"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"ondretann"},"content":"* 4a. User cancels the removal of employee.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"ondretann"},"content":" * 4a1. Payback acknowledges the cancellation.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"ondretann"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"ondretann"},"content":"**Use case: Tag a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"ondretann"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"ondretann"},"content":"1. User requests to tag an employee","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"ondretann"},"content":"2. User enters employee id and tags","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"ondretann"},"content":"3. Payback displays details of the employee and tags to be added for confirmation","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"ondretann"},"content":"4. User confirms tagging of employee","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"ondretann"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"ondretann"},"content":"**Extension**","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"ondretann"},"content":"* 2a. Employee ID entered is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"ondretann"},"content":" * 2a1. Payback shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"ondretann"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"ondretann"},"content":"* 2b. Tag parameter(s) is/are not specified.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"ondretann"},"content":" * 2b1. Payback shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"ondretann"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"ondretann"},"content":"* 4a. User cancels tagging of employee.","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"ondretann"},"content":" * 4a1. Payback acknowledges the cancellation.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"ondretann"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"ondretann"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"PateShin"},"content":"**Use case: Find a person**","lastModifiedDate":"2024-03-06"},{"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":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"PateShin"},"content":"2. PayBack shows a list of employees","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"PateShin"},"content":"3. User requests to find a specific employee in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"PateShin"},"content":"4. PayBack finds the employee","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"PateShin"},"content":"* 3a. The given entered format is incorrect.","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"PateShin"},"content":" * 3a1. PayBack shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"PateShin"},"content":"* 3b. There are no employees found.","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"PateShin"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"PateShin"},"content":" * 3b1. PayBack shows a not found message.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"PateShin"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"PateShin"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"PateShin"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"PateShin"},"content":"**Use case: List entire employees**","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"linnn-7"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"PateShin"},"content":"1. User requests to list employees","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"PateShin"},"content":"2. PayBack shows a list of employees","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"linnn-7"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"linnn-7"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"PateShin"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"linnn-7"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"linnn-7"},"content":"**Use case: Edit an employee**","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"linnn-7"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":435,"author":{"gitId":"linnn-7"},"content":"1. User requests to edit an employee\u0027s information","lastModifiedDate":"2024-03-06"},{"lineNumber":436,"author":{"gitId":"linnn-7"},"content":"2. User enters the employee\u0027s ID and fields that need to be updated","lastModifiedDate":"2024-03-06"},{"lineNumber":437,"author":{"gitId":"linnn-7"},"content":"3. PayBack changes the employee\u0027s information accordingly","lastModifiedDate":"2024-03-06"},{"lineNumber":438,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":439,"author":{"gitId":"linnn-7"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":441,"author":{"gitId":"linnn-7"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":442,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":443,"author":{"gitId":"linnn-7"},"content":"* 2a. The ID is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":444,"author":{"gitId":"linnn-7"},"content":" * 2a1. PayBack shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":445,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"linnn-7"},"content":" Use case resumes at Step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":448,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"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":451,"author":{"gitId":"linnn-7"},"content":"2. Should be able to hold up to 1000 employees without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":452,"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":453,"author":{"gitId":"linnn-7"},"content":"4. The system should provide real-time access to employee information with response times not exceeding 2 seconds for any query.","lastModifiedDate":"2024-03-06"},{"lineNumber":454,"author":{"gitId":"linnn-7"},"content":"5. The app should have an intuitive user interface, allowing users to easily navigate and perform tasks without extensive training.","lastModifiedDate":"2024-03-06"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"DhiraPT"},"content":"* **Actor**: A user or any other system that interacts with the system being described","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"DhiraPT"},"content":"* **API**: Abbreviation for Application Programming Interface, a set of rules and protocols that allows different software applications to communicate with each other","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"DhiraPT"},"content":"* **Aspect**: A particular feature or consideration that needs to be taken into account when designing or implementing a system","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"DhiraPT"},"content":"* **CLI**: Abbreviation for Command Line Interface, a text-based interface used for entering commands to interact with the application","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"DhiraPT"},"content":"* **DevOps**: A set of practices that combines software development (Dev) and IT operations (Ops), aimed at shortening the systems development life cycle and providing continuous delivery with high software quality","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"DhiraPT"},"content":"* **GUI**: Abbreviation for Graphical User Interface, a type of user interface that allows users to interact with the application through graphical icons and visual indicators, as opposed to text-based interfaces like command-line interfaces (CLI)","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"DhiraPT"},"content":"* **JSON**: Abbreviation for JavaScript Object Notation, a lightweight data-interchange format that uses key-value pairs","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":466,"author":{"gitId":"DhiraPT"},"content":"* **MSS**: Abbreviation for Main Success Scenario, the main flow of events in a use case","lastModifiedDate":"2024-03-07"},{"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":"DhiraPT"},"content":"* **Tag**: A label or identifier associated with a particular record or entity in the application","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"DhiraPT"},"content":"* **UI**: Abbreviation for User Interface, refers to the interface through which users interact with the application","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"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":478,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"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":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"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":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"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":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"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":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"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":512,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"linnn-7":38,"PateShin":25,"DhiraPT":46,"-":352,"ondretann":61}},{"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":"linnn-7"},"content":"PayBack 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, PayBack can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-02-28"},{"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":"linnn-7"},"content":"1. Download the latest `payback.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"linnn-7"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your application.","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"linnn-7"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar payback.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"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":"linnn-7"},"content":" * `/list` : Lists all contacts.","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"linnn-7"},"content":" * `/new jennie, 12334546, 123@gmail.com, 2021` : Adds a contact named `jennie` to the Address Book.","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"linnn-7"},"content":" * `/remove 240001` : Deletes the contact with id 240001.","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","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":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"linnn-7"},"content":" e.g. in `/new NAME`, `NAME` is a parameter which can be used as `/new John Doe`.","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"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":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"ondretann"},"content":"* Items with `…`​ after them can be used multiple times at least onxe.\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"ondretann"},"content":" e.g. `[t/TAG]…​` can be used as `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2024-02-28"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"DhiraPT"},"content":"* Parameters can be in any order, if specified.\u003cbr\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":54,"author":{"gitId":"DhiraPT"},"content":" e.g. if the command specifies `:name :phone`, `:phone :name` is also acceptable.","lastModifiedDate":"2024-02-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"linnn-7"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `/help`, `/list`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Format: `help`","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":"DhiraPT"},"content":"### Adding a new employee: `/new`","lastModifiedDate":"2024-02-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"DhiraPT"},"content":"Adds a new employee to the address book.","lastModifiedDate":"2024-02-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"DhiraPT"},"content":"Format:","lastModifiedDate":"2024-02-27"},{"lineNumber":76,"author":{"gitId":"DhiraPT"},"content":"* `/new NAME, PHONE_NUMBER, EMAIL, [YEAR_JOINED]`","lastModifiedDate":"2024-02-27"},{"lineNumber":77,"author":{"gitId":"DhiraPT"},"content":"* `/new :name NAME :phone PHONE_NUMBER :email EMAIL [:year YEAR_JOINED]`","lastModifiedDate":"2024-02-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"DhiraPT"},"content":"* `/new jennie, 12334546, 123@gmail.com, 2021`","lastModifiedDate":"2024-02-27"},{"lineNumber":81,"author":{"gitId":"DhiraPT"},"content":"* `/new :name jennie :phone 12334546 :email 123@gmail.com :year 2021`","lastModifiedDate":"2024-02-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"PateShin"},"content":"Show workers as a list. This can be used as “refresh” (e.g. after find command)","lastModifiedDate":"2024-02-28"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"PateShin"},"content":"**Format:** `list`","lastModifiedDate":"2024-02-28"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"linnn-7"},"content":"### Editing a person : `/edit`","lastModifiedDate":"2024-02-28"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"linnn-7"},"content":"Edits an existing employee in the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"linnn-7"},"content":"Format: `/edit ID [:name NAME] [:phone PHONE] [:email EMAIL] [:tag TAG]`","lastModifiedDate":"2024-02-28"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"linnn-7"},"content":"* Edits the person of the specified `ID`. The id refers to the 6-digits identity number. The id **must be 6 digits**: 240001, 240002...","lastModifiedDate":"2024-02-28"},{"lineNumber":96,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"linnn-7"},"content":"* When editing tags, all the existing tags of the person will be removed.","lastModifiedDate":"2024-02-28"},{"lineNumber":99,"author":{"gitId":"linnn-7"},"content":"* You can remove all the person’s tags by typing `:tag` without","lastModifiedDate":"2024-02-28"},{"lineNumber":100,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"linnn-7"},"content":"* `/edit 240001 :phone 91234567 :email: johndoe@example.com` Edits the phone number and email address of the person with id 240001 to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-02-28"},{"lineNumber":104,"author":{"gitId":"linnn-7"},"content":"* `/edit 240002 :name Betsy Crower :tag` Edits the name of the person with id 240002 to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-02-28"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"PateShin"},"content":"### Searching Workers by keyword: `find`","lastModifiedDate":"2024-02-28"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"PateShin"},"content":"Finds workers that contains any of the given keywords. It can be `ID`, `NAME`, `EMAIL` or `PHONE NUMBER`.","lastModifiedDate":"2024-02-28"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"PateShin"},"content":"**Format:**","lastModifiedDate":"2024-02-28"},{"lineNumber":111,"author":{"gitId":"PateShin"},"content":"* `Find by name: /find :name [name]`","lastModifiedDate":"2024-02-28"},{"lineNumber":112,"author":{"gitId":"PateShin"},"content":"* `Find by email: /find :email [email]`","lastModifiedDate":"2024-02-28"},{"lineNumber":113,"author":{"gitId":"PateShin"},"content":"* `Find by phone number: /find :phone [phone number]`","lastModifiedDate":"2024-02-28"},{"lineNumber":114,"author":{"gitId":"PateShin"},"content":"* `Find by worker’s ID: /find :ID [ID]`","lastModifiedDate":"2024-02-28"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"PateShin"},"content":"**Acceptable Format:**","lastModifiedDate":"2024-02-28"},{"lineNumber":117,"author":{"gitId":"PateShin"},"content":"* _Any letter cases are acceptable. e.g `Patrick` will match `patrick`_","lastModifiedDate":"2024-02-28"},{"lineNumber":118,"author":{"gitId":"PateShin"},"content":"* _ID: must be 6 digits of numbers_","lastModifiedDate":"2024-02-28"},{"lineNumber":119,"author":{"gitId":"PateShin"},"content":"* _Name: can be any case (Strings)_","lastModifiedDate":"2024-02-28"},{"lineNumber":120,"author":{"gitId":"PateShin"},"content":"* _Phone: must be numbers (integers)_","lastModifiedDate":"2024-02-28"},{"lineNumber":121,"author":{"gitId":"PateShin"},"content":"* _Email: must include “@”_","lastModifiedDate":"2024-02-28"},{"lineNumber":122,"author":{"gitId":"PateShin"},"content":"* _Only full keywords will be matched. e.g `Patrick` will not match `patr`_","lastModifiedDate":"2024-02-28"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"linnn-7"},"content":"* `/find :name John` returns `john` and `John Doe`","lastModifiedDate":"2024-03-06"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"linnn-7"},"content":"Format: `/remove ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"ondretann"},"content":"* Deletes the person with the specified `ID`.","lastModifiedDate":"2024-02-28"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"ondretann"},"content":"* `/remove 240001` deletes the person with `240001` ID.","lastModifiedDate":"2024-02-28"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":138,"author":{"gitId":"ondretann"},"content":"### Tagging a person: `tag`","lastModifiedDate":"2024-02-28"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":140,"author":{"gitId":"ondretann"},"content":"Tags the specified person from the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":142,"author":{"gitId":"ondretann"},"content":"Format: `/tag ID t/TAG...`","lastModifiedDate":"2024-02-28"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"ondretann"},"content":"* Tags the person with the specified `ID`.","lastModifiedDate":"2024-02-28"},{"lineNumber":145,"author":{"gitId":"ondretann"},"content":"* Allowed to have more than 1 tags per person.","lastModifiedDate":"2024-02-28"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"ondretann"},"content":"* `/tag 240001 t/finance t/manager` tags the person with `240001` ID with `finance` and `manager`.","lastModifiedDate":"2024-02-28"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"linnn-7"},"content":"PayBack 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-06"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":156,"author":{"gitId":"linnn-7"},"content":"PayBack data are saved automatically as a JSON file `[JAR file location]/data/payback.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":158,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":159,"author":{"gitId":"linnn-7"},"content":"If modifications to the data file result in an invalid format, PayBack will discard all data and initiate the next run with an empty data file. ","lastModifiedDate":"2024-03-06"},{"lineNumber":160,"author":{"gitId":"linnn-7"},"content":"Therefore, it is advisable to create a backup of the file before making any edits. ","lastModifiedDate":"2024-03-06"},{"lineNumber":161,"author":{"gitId":"linnn-7"},"content":"Additionally, specific changes may lead to unexpected behavior in PayBack, such as if a value entered falls outside the acceptable range. Hence, proceed with editing the data file only if you are certain that you can make accurate updates.","lastModifiedDate":"2024-03-06"},{"lineNumber":162,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":167,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"linnn-7"},"content":"## Q\u0026A","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"linnn-7"},"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 PayBack home folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":178,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":180,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":182,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":183,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2024-03-06"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":185,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"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":"2024-03-06"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":188,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":189,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-06"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":191,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":192,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"linnn-7"},"content":"**New** | `/new :name NAME :phone PHONE :email EMAIL [year joined] \u003cbr\u003e e.g., `/new jennie, 12334546, 123@gmail.com, 2021`","lastModifiedDate":"2024-03-06"},{"lineNumber":197,"author":{"gitId":"linnn-7"},"content":"**Delete** | `/remove ID`\u003cbr\u003e e.g., `/remove 240001`","lastModifiedDate":"2024-03-06"},{"lineNumber":198,"author":{"gitId":"linnn-7"},"content":"**Edit** | `/edit ID [:name NAME] [:phone PHONE] [:email EMAIL] [:tag TAG]`\u003cbr\u003e e.g.,`/edit 240001 :phone 91234567 :email: johndoe@example.com`","lastModifiedDate":"2024-03-06"},{"lineNumber":199,"author":{"gitId":"linnn-7"},"content":"**Find** | `/find :KEYWORD [KEYWORDS]`\u003cbr\u003e e.g., `find :name John`","lastModifiedDate":"2024-03-06"},{"lineNumber":200,"author":{"gitId":"linnn-7"},"content":"**List** | `/list`","lastModifiedDate":"2024-03-06"},{"lineNumber":201,"author":{"gitId":"linnn-7"},"content":"**Help** | `/help`","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"linnn-7":41,"PateShin":16,"DhiraPT":9,"-":125,"ondretann":10}},{"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":"linnn-7"},"content":" content: \"PayBack\";","lastModifiedDate":"2024-02-28"},{"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":{"linnn-7":1,"-":294}},{"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":"linnn-7"},"content":"title: PayBack","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":"linnn-7"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T12-4/tp/graph/badge.svg?token\u003d2O08Y4YRPC)](https://codecov.io/gh/AY2324S2-CS2103T-T12-4/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"linnn-7"},"content":"**PayBack is a desktop application for managing your employee details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"linnn-7"},"content":"* If you are interested in using PayBack, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"linnn-7"},"content":"* If you are interested about developing PayBack, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"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":{"linnn-7":5,"-":13}}] diff --git a/AY2324S2-CS2103T-T12-4_tp_master/commits.json b/AY2324S2-CS2103T-T12-4_tp_master/commits.json index 7d6049ad..33ceb8a6 100644 --- a/AY2324S2-CS2103T-T12-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-T12-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"linnn-7":[{"date":"2024-02-28","commitResults":[{"hash":"8cae8d4f6187d9ffb10d3891c2e610f61d7e667a","isMergeCommit":false,"messageTitle":"Update AboutUs, README, UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":21}}},{"hash":"d02bcfc24844b71e94355f5cd7d49b5afcdfb3fb","isMergeCommit":true,"messageTitle":"Merge pull request #7 from linnn-7/update-documents","messageBody":"Update AboutUs, README, UG","fileTypesAndContributionMap":{}},{"hash":"5a29abc6292b0095c1c0712d56ef058592fca709","isMergeCommit":true,"messageTitle":"Merge pull request #12 from DhiraPT/add-DhiraPT-info","messageBody":"Modify AboutUs.md, UserGuide.md and README.md","fileTypesAndContributionMap":{}},{"hash":"26cff7abe7a7f78f1d9455f01e96cad216c3fc52","isMergeCommit":true,"messageTitle":"Merge pull request #13 from ondretann/ondretann-patch-1","messageBody":"Ondretann patch 1","fileTypesAndContributionMap":{}},{"hash":"017b8740d40af7163e75d82d50ff44a360e57007","isMergeCommit":true,"messageTitle":"Merge pull request #14 from PateShin/update-info","messageBody":"Update info","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"4f5a71b474bb6f8d766b2a589d1185788410ebf7","isMergeCommit":false,"messageTitle":"Update documents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":70}}},{"hash":"23c1461fe60d53d7930b3e36e6cf5360978da457","isMergeCommit":true,"messageTitle":"Merge pull request #15 from linnn-7/update-ug-aboutus","messageBody":"Update documents","fileTypesAndContributionMap":{}},{"hash":"b776d3f1f4be67a9486381c2687d262ce17c2fb5","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":8}}},{"hash":"06935adbf28def047422ca0c7f6d579da1086eab","isMergeCommit":true,"messageTitle":"Merge pull request #21 from linnn-7/update-dg","messageBody":"Update DG","fileTypesAndContributionMap":{}},{"hash":"e7ab0c7e6a9dd22bf51f30a10ba77ca87ae27a12","isMergeCommit":true,"messageTitle":"Merge pull request #22 from ondretann/branch-UserProfile","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"4c4da46d1a505c885ab11f00740555310d8354f0","isMergeCommit":true,"messageTitle":"Merge pull request #23 from PateShin/Update-DeveloperGuide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}},{"hash":"1457ad1e5e28b2dbb83851cabb03562f6841c0f9","isMergeCommit":false,"messageTitle":"Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":0}}},{"hash":"bb71fa39594503e7ab35a4f1d823a90f57dcbdb2","isMergeCommit":true,"messageTitle":"Merge pull request #24 from linnn-7/update-user-case","messageBody":"Update use cases","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"18c970dd294878011bbab1a6004862d1110fcfa2","isMergeCommit":true,"messageTitle":"Merge pull request #26 from DhiraPT/branch-UseCases","messageBody":"Update DG Use Cases","fileTypesAndContributionMap":{}},{"hash":"f6ef9d331cf3e95c678df7a62e37c95dcb459d3a","isMergeCommit":true,"messageTitle":"Merge pull request #25 from DhiraPT/branch-DeveloperGuide","messageBody":"Update DG glossary","fileTypesAndContributionMap":{}},{"hash":"cc8df61c19b10b51487dae277b1f96607f237caa","isMergeCommit":false,"messageTitle":"Update website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":7}}},{"hash":"865b17001f171a459082c7967b6bd628ea4b0036","isMergeCommit":true,"messageTitle":"Merge pull request #27 from linnn-7/update-website","messageBody":"Update website","fileTypesAndContributionMap":{}},{"hash":"e463995e767a49bdc60ea51536d51b7e52426ac6","isMergeCommit":true,"messageTitle":"Merge pull request #28 from ondretann/branch-UseCases","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"PateShin":[{"date":"2024-02-28","commitResults":[{"hash":"f6cb98f66b972681c4039230acc72ab517deba7c","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":21}}},{"hash":"5a7f45f7c3d68fea86388676e399f6838e634895","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"444bbb1b6c0164b83e84b5b1ae8a499e3570ff0e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-info","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"f676b4cc2f4fb0eefcb80a1fd9efe84639b7e6cd","isMergeCommit":false,"messageTitle":"Update DevelopeGuide.md","messageBody":"This commit shows DeveloperGuide is edited\n\nKey Changes\n *The User stories are addeed\n *The Use cases of `list` and `found` are added\n","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":35}}},{"hash":"4d64d72aabba806399e62991c7d168d1a4a7a5e3","isMergeCommit":false,"messageTitle":"Modify DeveloperGuide","messageBody":"The format of the DeveloperGuide has fixed:\n\nChanges:\n *Remove not required blank spaces\n","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":18}}},{"hash":"3ab36ea71fbb2b38c1eb284abbeeadbfef00351f","isMergeCommit":false,"messageTitle":"Fix DeveloperGuide Format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"20b85e2e52acb83ebbae3e4bd2069720f57b84e8","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{}}]}],"DhiraPT":[{"date":"2024-02-27","commitResults":[{"hash":"8a8a5fa520ad32a9a4d9457ca89655dad826ed3a","isMergeCommit":false,"messageTitle":"Modify AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"147bbacf7bdab639c2a9b955dd05f2dc3c1eff41","isMergeCommit":false,"messageTitle":"Modify UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":11}}}]},{"date":"2024-03-07","commitResults":[{"hash":"90695bee8f84fedaeafd45402ffc1fae472ab457","isMergeCommit":false,"messageTitle":"Add new terms to Developer\u0027s Guide glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"78f69fa7c29a8dc84692310c07146b3b81e50f35","isMergeCommit":false,"messageTitle":"Add use case for adding new employee","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":0}}}]}],"ondretann":[{"date":"2024-02-28","commitResults":[{"hash":"eb429fde8cef48f9f716f7120fc672cf7f6b3f1e","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"856d2f8f2018bd24098c534c0ce97c29d7204d17","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":8}}}]},{"date":"2024-03-06","commitResults":[{"hash":"ba966a542f815870a88e1170382a0c746cd93f36","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-07","commitResults":[{"hash":"d647f5c7f9fe6b364da04781ca01107cb4213e9d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":59,"deletions":0}}}]}]},"authorFileTypeContributionMap":{"linnn-7":{"docs":90,"functional-code":0,"test-code":0,"other":1},"PateShin":{"docs":44,"functional-code":0,"test-code":0},"DhiraPT":{"docs":59,"functional-code":0,"test-code":0},"ondretann":{"docs":74,"functional-code":0,"test-code":0}},"authorContributionVariance":{"linnn-7":1988.8369,"PateShin":1159.9438,"DhiraPT":179.2041,"ondretann":272.83673},"authorDisplayNameMap":{"linnn-7":"CS2103T-T12-4 LIN .. BIN","PateShin":"CS2103T-T12-4 SHIN..YOON","DhiraPT":"CS2103T-T12-4 DHIR..GARA","ondretann":"CS2103T-T12-4 TANN..NDRE"}} +{"authorDailyContributionsMap":{"linnn-7":[{"date":"2024-02-28","commitResults":[{"hash":"8cae8d4f6187d9ffb10d3891c2e610f61d7e667a","isMergeCommit":false,"messageTitle":"Update AboutUs, README, UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":21}}},{"hash":"d02bcfc24844b71e94355f5cd7d49b5afcdfb3fb","isMergeCommit":true,"messageTitle":"Merge pull request #7 from linnn-7/update-documents","messageBody":"Update AboutUs, README, UG","fileTypesAndContributionMap":{}},{"hash":"5a29abc6292b0095c1c0712d56ef058592fca709","isMergeCommit":true,"messageTitle":"Merge pull request #12 from DhiraPT/add-DhiraPT-info","messageBody":"Modify AboutUs.md, UserGuide.md and README.md","fileTypesAndContributionMap":{}},{"hash":"26cff7abe7a7f78f1d9455f01e96cad216c3fc52","isMergeCommit":true,"messageTitle":"Merge pull request #13 from ondretann/ondretann-patch-1","messageBody":"Ondretann patch 1","fileTypesAndContributionMap":{}},{"hash":"017b8740d40af7163e75d82d50ff44a360e57007","isMergeCommit":true,"messageTitle":"Merge pull request #14 from PateShin/update-info","messageBody":"Update info","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"4f5a71b474bb6f8d766b2a589d1185788410ebf7","isMergeCommit":false,"messageTitle":"Update documents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":70}}},{"hash":"23c1461fe60d53d7930b3e36e6cf5360978da457","isMergeCommit":true,"messageTitle":"Merge pull request #15 from linnn-7/update-ug-aboutus","messageBody":"Update documents","fileTypesAndContributionMap":{}},{"hash":"b776d3f1f4be67a9486381c2687d262ce17c2fb5","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":8}}},{"hash":"06935adbf28def047422ca0c7f6d579da1086eab","isMergeCommit":true,"messageTitle":"Merge pull request #21 from linnn-7/update-dg","messageBody":"Update DG","fileTypesAndContributionMap":{}},{"hash":"e7ab0c7e6a9dd22bf51f30a10ba77ca87ae27a12","isMergeCommit":true,"messageTitle":"Merge pull request #22 from ondretann/branch-UserProfile","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"4c4da46d1a505c885ab11f00740555310d8354f0","isMergeCommit":true,"messageTitle":"Merge pull request #23 from PateShin/Update-DeveloperGuide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}},{"hash":"1457ad1e5e28b2dbb83851cabb03562f6841c0f9","isMergeCommit":false,"messageTitle":"Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":0}}},{"hash":"bb71fa39594503e7ab35a4f1d823a90f57dcbdb2","isMergeCommit":true,"messageTitle":"Merge pull request #24 from linnn-7/update-user-case","messageBody":"Update use cases","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"18c970dd294878011bbab1a6004862d1110fcfa2","isMergeCommit":true,"messageTitle":"Merge pull request #26 from DhiraPT/branch-UseCases","messageBody":"Update DG Use Cases","fileTypesAndContributionMap":{}},{"hash":"f6ef9d331cf3e95c678df7a62e37c95dcb459d3a","isMergeCommit":true,"messageTitle":"Merge pull request #25 from DhiraPT/branch-DeveloperGuide","messageBody":"Update DG glossary","fileTypesAndContributionMap":{}},{"hash":"cc8df61c19b10b51487dae277b1f96607f237caa","isMergeCommit":false,"messageTitle":"Update website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":7}}},{"hash":"865b17001f171a459082c7967b6bd628ea4b0036","isMergeCommit":true,"messageTitle":"Merge pull request #27 from linnn-7/update-website","messageBody":"Update website","fileTypesAndContributionMap":{}},{"hash":"e463995e767a49bdc60ea51536d51b7e52426ac6","isMergeCommit":true,"messageTitle":"Merge pull request #28 from ondretann/branch-UseCases","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"791330ddedfeda87ccfe3e1a91ca662b402194f3","isMergeCommit":false,"messageTitle":"Update website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":7}}},{"hash":"85b375c372b743d729d890069eaeed172d41b772","isMergeCommit":true,"messageTitle":"Merge pull request #29 from linnn-7/update-website1","messageBody":"Update website","fileTypesAndContributionMap":{}}]}],"PateShin":[{"date":"2024-02-28","commitResults":[{"hash":"f6cb98f66b972681c4039230acc72ab517deba7c","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":21}}},{"hash":"5a7f45f7c3d68fea86388676e399f6838e634895","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"444bbb1b6c0164b83e84b5b1ae8a499e3570ff0e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-info","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"f676b4cc2f4fb0eefcb80a1fd9efe84639b7e6cd","isMergeCommit":false,"messageTitle":"Update DevelopeGuide.md","messageBody":"This commit shows DeveloperGuide is edited\n\nKey Changes\n *The User stories are addeed\n *The Use cases of `list` and `found` are added\n","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":35}}},{"hash":"4d64d72aabba806399e62991c7d168d1a4a7a5e3","isMergeCommit":false,"messageTitle":"Modify DeveloperGuide","messageBody":"The format of the DeveloperGuide has fixed:\n\nChanges:\n *Remove not required blank spaces\n","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":18}}},{"hash":"3ab36ea71fbb2b38c1eb284abbeeadbfef00351f","isMergeCommit":false,"messageTitle":"Fix DeveloperGuide Format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"20b85e2e52acb83ebbae3e4bd2069720f57b84e8","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{}}]}],"DhiraPT":[{"date":"2024-02-27","commitResults":[{"hash":"8a8a5fa520ad32a9a4d9457ca89655dad826ed3a","isMergeCommit":false,"messageTitle":"Modify AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"147bbacf7bdab639c2a9b955dd05f2dc3c1eff41","isMergeCommit":false,"messageTitle":"Modify UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":11}}}]},{"date":"2024-03-07","commitResults":[{"hash":"90695bee8f84fedaeafd45402ffc1fae472ab457","isMergeCommit":false,"messageTitle":"Add new terms to Developer\u0027s Guide glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"78f69fa7c29a8dc84692310c07146b3b81e50f35","isMergeCommit":false,"messageTitle":"Add use case for adding new employee","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":0}}}]}],"ondretann":[{"date":"2024-02-28","commitResults":[{"hash":"eb429fde8cef48f9f716f7120fc672cf7f6b3f1e","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"856d2f8f2018bd24098c534c0ce97c29d7204d17","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":8}}}]},{"date":"2024-03-06","commitResults":[{"hash":"ba966a542f815870a88e1170382a0c746cd93f36","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-07","commitResults":[{"hash":"d647f5c7f9fe6b364da04781ca01107cb4213e9d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":59,"deletions":0}}}]}]},"authorFileTypeContributionMap":{"linnn-7":{"docs":108,"functional-code":0,"test-code":0,"other":1},"PateShin":{"docs":44,"functional-code":0,"test-code":0},"DhiraPT":{"docs":59,"functional-code":0,"test-code":0},"ondretann":{"docs":74,"functional-code":0,"test-code":0}},"authorContributionVariance":{"linnn-7":2021.2092,"PateShin":1159.9438,"DhiraPT":179.2041,"ondretann":272.83673},"authorDisplayNameMap":{"linnn-7":"CS2103T-T12-4 LIN .. BIN","PateShin":"CS2103T-T12-4 SHIN..YOON","DhiraPT":"CS2103T-T12-4 DHIR..GARA","ondretann":"CS2103T-T12-4 TANN..NDRE"}} diff --git a/AY2324S2-CS2103T-T13-1_tp_master/authorship.json b/AY2324S2-CS2103T-T13-1_tp_master/authorship.json index 8dfc9bcb..f591925a 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":"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 c79625c6..17493036 100644 --- a/AY2324S2-CS2103T-T13-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-T13-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"faaheem13":[],"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}}}]}],"taniatsq":[],"nichee":[]},"authorFileTypeContributionMap":{"faaheem13":{"docs":0,"functional-code":0,"test-code":0},"AndrewOng2066":{"docs":1,"functional-code":0,"test-code":0},"taniatsq":{"docs":0,"functional-code":0,"test-code":0},"nichee":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"faaheem13":0.0,"AndrewOng2066":0.88888884,"taniatsq":0.0,"nichee":0.0},"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":{}}]}],"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"}} diff --git a/AY2324S2-CS2103T-T14-2_tp_master/authorship.json b/AY2324S2-CS2103T-T14-2_tp_master/authorship.json index 898c0ebb..f9bfbc1a 100644 --- a/AY2324S2-CS2103T-T14-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T14-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Vision-2000"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T14-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T14-2/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":"Vision-2000"},"content":"**MediTrack is a desktop application for managing your patient details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Vision-2000"},"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":{"-":3,"Vision-2000":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":"-"},"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":"jskimdev"},"content":"### Sivakumar Aishvarya","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"S-Aishvarya"},"content":"\u003cimg src\u003d\"images/s-aishvarya.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"S-Aishvarya"},"content":"[[github](https://github.com/S-Aishvarya)]","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"S-Aishvarya"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"S-Aishvarya"},"content":"* Responsibilities: Scheduling and tracking + Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"jskimdev"},"content":"### Eugene Hirose","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Vision-2000"},"content":"\u003cimg src\u003d\"images/vision-2000.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"Vision-2000"},"content":"[[github](http://github.com/Vision-2000)]","lastModifiedDate":"2024-03-07"},{"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: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Vision-2000"},"content":"* Responsibilities: Testing + UI","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"jskimdev"},"content":"### Jeong Jaeho","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"jeong-jaeho"},"content":"\u003cimg src\u003d\"images/jeong-jaeho.png\" width\u003d\"200px\"\u003e ","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"jeong-jaeho"},"content":"[[github](http://github.com/jeong-jaeho)]","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"jeong-jaeho"},"content":"* Responsibilities: Team lead + Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"jskimdev"},"content":"### Kim Junseo","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"jskimdev"},"content":"\u003cimg src\u003d\"images/jskimdev.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"jskimdev"},"content":"[[github](https://github.com/jskimdev)]","lastModifiedDate":"2024-03-06"},{"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":"jskimdev"},"content":"* Responsibilities: Code Quality + Model","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jskimdev":7,"S-Aishvarya":4,"-":36,"jeong-jaeho":3,"Vision-2000":3}},{"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":"Vision-2000"},"content":"# MediTrack","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"Vision-2000"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T14-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T14-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Vision-2000"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T14-2/tp/graph/badge.svg?token\u003dyYHlxxXkJQ)](https://codecov.io/gh/AY2324S2-CS2103T-T14-2/tp)","lastModifiedDate":"2024-03-06"},{"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":"Vision-2000"},"content":"**MediTrack is a desktop application for managing your patient details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"Vision-2000"},"content":"* If you are interested in using MediTrack, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"Vision-2000"},"content":"* If you are interested about developing MediTrack, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-06"},{"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":"Vision-2000"},"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":{"-":14,"Vision-2000":7}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Vision-2000"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T14-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T14-2/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":"Vision-2000"},"content":"**MediTrack is a desktop application for managing your patient details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"Vision-2000"},"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":{"-":3,"Vision-2000":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":"-"},"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":"jskimdev"},"content":"### Sivakumar Aishvarya","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"S-Aishvarya"},"content":"\u003cimg src\u003d\"images/s-aishvarya.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"S-Aishvarya"},"content":"[[github](https://github.com/S-Aishvarya)]","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"S-Aishvarya"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"S-Aishvarya"},"content":"* Responsibilities: Scheduling and tracking + Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"jskimdev"},"content":"### Eugene Hirose","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Vision-2000"},"content":"\u003cimg src\u003d\"images/vision-2000.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"Vision-2000"},"content":"[[github](http://github.com/Vision-2000)]","lastModifiedDate":"2024-03-07"},{"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: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"Vision-2000"},"content":"* Responsibilities: Testing + UI","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"jskimdev"},"content":"### Jeong Jaeho","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"jeong-jaeho"},"content":"\u003cimg src\u003d\"images/jeong-jaeho.png\" width\u003d\"200px\"\u003e ","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"jeong-jaeho"},"content":"[[github](http://github.com/jeong-jaeho)]","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"jeong-jaeho"},"content":"* Responsibilities: Team lead + Integration","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"jskimdev"},"content":"### Kim Junseo","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"jskimdev"},"content":"\u003cimg src\u003d\"images/jskimdev.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"jskimdev"},"content":"[[github](https://github.com/jskimdev)]","lastModifiedDate":"2024-03-06"},{"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":"jskimdev"},"content":"* Responsibilities: Code Quality + Model","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jskimdev":7,"S-Aishvarya":4,"-":36,"jeong-jaeho":3,"Vision-2000":3}},{"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":"Vision-2000"},"content":"\u003c type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-03-07"},{"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":"Vision-2000"},"content":"* has a need to manage a significant number of patient details","lastModifiedDate":"2024-03-07"},{"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":"Vision-2000"},"content":"**Value proposition**: MediTrack can manage patient details faster than a typical mouse/GUI driven app.","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"Vision-2000"},"content":"|----------|--------------|----------------------------------|--------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"Vision-2000"},"content":"| `* * *` | receptionist | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"Vision-2000"},"content":"| `* * *` | receptionist | see the list of patients | check the index of all patients |","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"Vision-2000"},"content":"| `* * *` | receptionist | add a new patient | |","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"Vision-2000"},"content":"| `* * *` | receptionist | delete a patient | remove entries that are outdated |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"Vision-2000"},"content":"| `* * *` | receptionist | find a patient by name | locate details of a patient without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"Vision-2000"},"content":"| `* *` | receptionist | find a patient by contact number | look for a specific patient without worrying about duplicate names |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"Vision-2000"},"content":"| `* *` | receptionist | delete all patients | easily reset the list to a blank state |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"Vision-2000"},"content":"| `* *` | receptionist | exit with a command | close the application with keyboard inputs only |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"*{More to be added}*","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":"Vision-2000"},"content":"(For all use cases below, the **System** is the `MediTrack` and the **Actor** is the `receptionist`, unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"Vision-2000"},"content":"**Use case: UC01 - Add a patient**","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"**MSS** ","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"Vision-2000"},"content":"1. Receptionist requests to add a patient’s data in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"Vision-2000"},"content":"2. MediTrack adds the patient’s data into the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"Vision-2000"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"Vision-2000"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"Vision-2000"},"content":"* 1a. There is already a patient with the same phone number. ","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"Vision-2000"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"Vision-2000"},"content":"**Use case: UC02 - Delete a patient**","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"Vision-2000"},"content":"1. Receptionist requests to list patients.","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"Vision-2000"},"content":"2. MediTrack shows a list of patients.","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"Vision-2000"},"content":"3. Receptionist requests to delete a specific patient in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"Vision-2000"},"content":"4. MediTrack deletes the patient.","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"Vision-2000"},"content":" * 3a1. MediTrack shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"Vision-2000"},"content":"**Use case: UC03 - Find a patient**","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"Vision-2000"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"Vision-2000"},"content":"1. Receptionist requests for a patient\u0027s information.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"Vision-2000"},"content":"2. MediTrack returns the patient\u0027s information.","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"Vision-2000"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"Vision-2000"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"Vision-2000"},"content":"* 1a. The patient\u0027s information is not found in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"Vision-2000"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"Vision-2000"},"content":"**Use case: UC04 - Exit**","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"Vision-2000"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"Vision-2000"},"content":"1. Receptionist requests to exit the program.","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"Vision-2000"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"Vision-2000"},"content":"**Use case: UC05 - Delete all patients**","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"Vision-2000"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"Vision-2000"},"content":"1. Receptionist requests to delete all patients.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"Vision-2000"},"content":"2. MediTrack asks for confirmation.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"Vision-2000"},"content":"3. Receptionist confirms.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"Vision-2000"},"content":"4. MediTrack deletes all patient information.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"Vision-2000"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"Vision-2000"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"Vision-2000"},"content":"* 1a. There are no patient information.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"Vision-2000"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"Vision-2000"},"content":"* 3a. Receptionist cancels.","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"Vision-2000"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"Vision-2000"},"content":"**Use case: UC06 - Start the system**","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"Vision-2000"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"Vision-2000"},"content":"1. Receptionist starts the program","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"Vision-2000"},"content":"2. MediTrack shows a list of patients","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"Vision-2000"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"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":403,"author":{"gitId":"Vision-2000"},"content":"2. Should be able to hold up to 100 patients without a noticeable lag in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"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":405,"author":{"gitId":"Vision-2000"},"content":"4. Should work without internet connection.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"Vision-2000"},"content":"5. Can only be used by a registered receptionist.","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"Vision-2000"},"content":"6. Each command should take no more than 1 second until a response is displayed.","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"Vision-2000"},"content":"* **Mainstream OS**: Windows, Linux, MacOS","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"Vision-2000"},"content":"* **Patient**: A person who has visited the clinic at least once due to an illness","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"Vision-2000"},"content":"* **Receptionist** The user operating MediTrack","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"Vision-2000"},"content":"* **Patient information**: Name, contact number, address, email, date of birth, symptoms, date of visit ","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":426,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":427,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"Vision-2000"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"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":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"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":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"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":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"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":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"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":462,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":380,"Vision-2000":92}},{"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":"Vision-2000"},"content":"# MediTrack","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"Vision-2000"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T14-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T14-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Vision-2000"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T14-2/tp/graph/badge.svg?token\u003dyYHlxxXkJQ)](https://codecov.io/gh/AY2324S2-CS2103T-T14-2/tp)","lastModifiedDate":"2024-03-06"},{"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":"Vision-2000"},"content":"**MediTrack is a desktop application for managing your patient details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"Vision-2000"},"content":"* If you are interested in using MediTrack, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"Vision-2000"},"content":"* If you are interested about developing MediTrack, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-06"},{"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":"Vision-2000"},"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":{"-":14,"Vision-2000":7}}] diff --git a/AY2324S2-CS2103T-T14-2_tp_master/commits.json b/AY2324S2-CS2103T-T14-2_tp_master/commits.json index d2540690..c1f6fff4 100644 --- a/AY2324S2-CS2103T-T14-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T14-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"jskimdev":[{"date":"2024-03-06","commitResults":[{"hash":"bc88a10d930d159cf2fc80081f8fe5064fb4c44b","isMergeCommit":false,"messageTitle":"Update Junseo details in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":18}}}]},{"date":"2024-03-07","commitResults":[{"hash":"8e58e0688667d63e7e49ab56419b6200e7ce09c3","isMergeCommit":false,"messageTitle":"Add fifth member in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":1}}},{"hash":"a696da6f4cfb93ccd976425c88a624b03496fde6","isMergeCommit":false,"messageTitle":"Add empty line at the end AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"bb8310dddc2c0cc7d4605183d96c45302c7e15b6","isMergeCommit":false,"messageTitle":"Remove unused fifth member in AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":10}}},{"hash":"9d998cfeedfdd414b46f1a6fb4043417056ce09a","isMergeCommit":true,"messageTitle":"Merge pull request #11 from Vision-2000/branch-README-1","messageBody":"Update README.md with mock Ui image and our project content","fileTypesAndContributionMap":{}},{"hash":"752caf17bb608c213a05e7ff9268e892860549b0","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Vision-2000/branch-AboutUs-1","messageBody":"Update Eugene details in About Us page","fileTypesAndContributionMap":{}},{"hash":"b64fdc59ff6d02a611e983b7edc4944675bbad09","isMergeCommit":true,"messageTitle":"Merge pull request #14 from jeong-jaeho/branch-AboutUS-Jaeho","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}}]}],"S-Aishvarya":[{"date":"2024-03-07","commitResults":[{"hash":"f4bacae85feb883e0f8bf3890c7d4a6101a8906c","isMergeCommit":false,"messageTitle":"no message","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}}]}],"jeong-jaeho":[{"date":"2024-03-07","commitResults":[{"hash":"1b9cb2644803715aef687bfdc11ca1a6f08a5ef6","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"bca86dff2ff633f6c65924aaaba7f2d910713528","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"038e793283979f905fd1e9c5611d72c62d885743","isMergeCommit":true,"messageTitle":"Merge pull request #16 from S-Aishvarya/branch-AboutUs-Aishvarya","messageBody":"Update Aishvarya details in AboutUs page","fileTypesAndContributionMap":{}}]}],"Vision-2000":[{"date":"2024-03-06","commitResults":[{"hash":"92ebca6ca8eb0eed28742478ed841f5c1c84cdd8","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"66bc8733188bac87a8f69970f27933185fdbaa1e","isMergeCommit":true,"messageTitle":"Merge pull request #12 from jskimdev/branch-AboutUs","messageBody":"Update Junseo details in About Us page","fileTypesAndContributionMap":{}},{"hash":"e63466ad93e89a3e53a4fb50e8aac4705b7e09c4","isMergeCommit":false,"messageTitle":"Update Eugene details in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"ba146c58767287e8d9c7cb22b9ea5ecca1248ac6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":11}}},{"hash":"ccf6d400fb35640b7078b05174b63967a772c197","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Vision-2000/branch-README-2","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"jskimdev":{"docs":7,"functional-code":0,"test-code":0},"S-Aishvarya":{"docs":4,"functional-code":0,"test-code":0},"jeong-jaeho":{"docs":3,"functional-code":0,"test-code":0},"Vision-2000":{"docs":14,"functional-code":0,"test-code":0}},"authorContributionVariance":{"jskimdev":86.025505,"S-Aishvarya":11.209183,"jeong-jaeho":4.244898,"Vision-2000":44.80102},"authorDisplayNameMap":{"jskimdev":"CS2103T-T14-2 KIM ..NSEO","S-Aishvarya":"CS2103T-T14-2 SIVA..ARYA","jeong-jaeho":"CS2103T-T14-2 JEON..AEHO","Vision-2000":"CS2103T-T14-2 EUGE..ROSE"}} +{"authorDailyContributionsMap":{"jskimdev":[{"date":"2024-03-06","commitResults":[{"hash":"bc88a10d930d159cf2fc80081f8fe5064fb4c44b","isMergeCommit":false,"messageTitle":"Update Junseo details in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":18}}}]},{"date":"2024-03-07","commitResults":[{"hash":"8e58e0688667d63e7e49ab56419b6200e7ce09c3","isMergeCommit":false,"messageTitle":"Add fifth member in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":1}}},{"hash":"a696da6f4cfb93ccd976425c88a624b03496fde6","isMergeCommit":false,"messageTitle":"Add empty line at the end AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"bb8310dddc2c0cc7d4605183d96c45302c7e15b6","isMergeCommit":false,"messageTitle":"Remove unused fifth member in AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":10}}},{"hash":"9d998cfeedfdd414b46f1a6fb4043417056ce09a","isMergeCommit":true,"messageTitle":"Merge pull request #11 from Vision-2000/branch-README-1","messageBody":"Update README.md with mock Ui image and our project content","fileTypesAndContributionMap":{}},{"hash":"752caf17bb608c213a05e7ff9268e892860549b0","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Vision-2000/branch-AboutUs-1","messageBody":"Update Eugene details in About Us page","fileTypesAndContributionMap":{}},{"hash":"b64fdc59ff6d02a611e983b7edc4944675bbad09","isMergeCommit":true,"messageTitle":"Merge pull request #14 from jeong-jaeho/branch-AboutUS-Jaeho","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}},{"hash":"e949b11b0bdaeabb3f22a4f200d1f2ae3f1773bd","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Vision-2000/branch-DeveloperGuide-1","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"S-Aishvarya":[{"date":"2024-03-07","commitResults":[{"hash":"f4bacae85feb883e0f8bf3890c7d4a6101a8906c","isMergeCommit":false,"messageTitle":"no message","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}}]}],"jeong-jaeho":[{"date":"2024-03-07","commitResults":[{"hash":"1b9cb2644803715aef687bfdc11ca1a6f08a5ef6","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"bca86dff2ff633f6c65924aaaba7f2d910713528","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"038e793283979f905fd1e9c5611d72c62d885743","isMergeCommit":true,"messageTitle":"Merge pull request #16 from S-Aishvarya/branch-AboutUs-Aishvarya","messageBody":"Update Aishvarya details in AboutUs page","fileTypesAndContributionMap":{}}]}],"Vision-2000":[{"date":"2024-03-06","commitResults":[{"hash":"92ebca6ca8eb0eed28742478ed841f5c1c84cdd8","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]},{"date":"2024-03-07","commitResults":[{"hash":"66bc8733188bac87a8f69970f27933185fdbaa1e","isMergeCommit":true,"messageTitle":"Merge pull request #12 from jskimdev/branch-AboutUs","messageBody":"Update Junseo details in About Us page","fileTypesAndContributionMap":{}},{"hash":"e63466ad93e89a3e53a4fb50e8aac4705b7e09c4","isMergeCommit":false,"messageTitle":"Update Eugene details in About Us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"ba146c58767287e8d9c7cb22b9ea5ecca1248ac6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":11}}},{"hash":"ccf6d400fb35640b7078b05174b63967a772c197","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Vision-2000/branch-README-2","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"ba214f35c54300822ece6a6bf384e00336be0d01","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":21}}}]}]},"authorFileTypeContributionMap":{"jskimdev":{"docs":7,"functional-code":0,"test-code":0},"S-Aishvarya":{"docs":4,"functional-code":0,"test-code":0},"jeong-jaeho":{"docs":3,"functional-code":0,"test-code":0},"Vision-2000":{"docs":106,"functional-code":0,"test-code":0}},"authorContributionVariance":{"jskimdev":86.025505,"S-Aishvarya":11.209183,"jeong-jaeho":4.244898,"Vision-2000":1311.495},"authorDisplayNameMap":{"jskimdev":"CS2103T-T14-2 KIM ..NSEO","S-Aishvarya":"CS2103T-T14-2 SIVA..ARYA","jeong-jaeho":"CS2103T-T14-2 JEON..AEHO","Vision-2000":"CS2103T-T14-2 EUGE..ROSE"}} diff --git a/AY2324S2-CS2103T-T15-2_tp_master/authorship.json b/AY2324S2-CS2103T-T15-2_tp_master/authorship.json index c0e9baf6..a266a765 100644 --- a/AY2324S2-CS2103T-T15-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T15-2_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":"","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":"cheahTJ"},"content":"## Arona Pro","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"* This is **a sample project given to Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"* The project simulates an ongoing software project for a desktop application (called _AronaPro_) catered for","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":" Computer Science teaching assistants who appreciate an organised and vibrant approach to query,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":" and manage an array of students and professors’ contacts with CLI.","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":" * It is **written in OOP fashion**.","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"### Main features include:","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":"#### View Contact Information","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"Description: `View` command allows you to see all the existing contacts of your students","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `view`","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"#### Add New Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"Description: `Add` command allows you to add new contacts of your students into the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `id/NUSID n/NAME p/PHONE [e/EMAIL] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":"#### Edit Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"Description: `Edit` command allows you to edit existing contacts of your students in the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `edit id/NUSID [n/NEWNAME] [p/NEWPHONE] [e/NEWEMAIL]`","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":"#### Delete Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"Description: `Delete` command allows you to delete existing contacts in the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `delete id/NUSID`","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":"#### Filtering Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":"Description: `Filter` command allows you to filter desired contacts in the address book based on group ","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":"and tag specified","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `filter [n/NAME] [p/PHONE] [e/EMAIL] [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"#### Assign contacts a tutorial group","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":"Description: `Assign` command allows you to assign students into their respective tutorial groups in the ","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":"address book","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `assign id/NUSID [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"#### Add Schedule","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"Description: `Schedyle` command allows you to schedule an appointment with students","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `schedule id/NUSID d/DATE from/FROM [to/TO] [t/TAG] [r/REMARK]`","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"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":48,"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":{"cheahTJ":41,"-":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":"","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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"### Cheah Tze Juen","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/cheahtj.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"[[github](https://github.com/cheahTJ)]","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/cheahtj.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"* Roles: Team Lead","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":" * Dedicates tasks among team and facilitate coordination among team members","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"### Tan Hong Jun","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/hjuntan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/hjuntan)]","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/hjuntan.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":"* Role: Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that all documentation are up-to-date and are specific to the user","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":"### Loh Jin Hun","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/Ragnapop.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/Ragnapop)] [[portfolio](team/ragnapop.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that all features are properly tested, even on edge cases","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":"### Chen Kuan Min","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/Rikko1204.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/Rikko1204)]","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/rikko1204.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"cheahTJ"},"content":"* Role: Scheduling and tracking","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that the team is on pace with the 2 weeks sprint and helps assign","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"cheahTJ"},"content":" task equally to members","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"cheahTJ"},"content":"### Guo Yuhao","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/ringoftheking.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/RingoftheKing)]","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/ringoftheking.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":63,"author":{"gitId":"cheahTJ"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":64,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that the team is focussed on the individual task and is able to deliver the intended feature","lastModifiedDate":"2024-03-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":33,"-":32}},{"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":"RingoftheKing"},"content":"|----------|-------------------------------------------------------------------------------|--------------------------------------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"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":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | add a new student, prof, TA | know how to contact them |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | find a student by name or class | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | Group students into classes | know which class my student is in |","lastModifiedDate":"2024-03-04"},{"lineNumber":297,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching assistant | find my supervisor(s) | Report any admin issues my students would raise |","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | University student with different friend groups | Tag or categorize my contacts | Search by the friend groups I\u0027m concerned with |","lastModifiedDate":"2024-03-04"},{"lineNumber":299,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant who wants to meet up with Profs and students | Schedule events to do so | remind myself to meet up or know my free times. |","lastModifiedDate":"2024-03-04"},{"lineNumber":300,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant with important people to report to or stay in contact with | pin important contacts | |","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant who needs to announce information to his students | copy a (group of) student(s)\u0027 contact info onto my clipboard | announce a message efficiently to many students |","lastModifiedDate":"2024-03-04"},{"lineNumber":302,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Forgetful Teaching Assistant | A check for addition of duplicate contacts | can reduce clutter of my list |","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Teaching assistant who might mistype | Have a Confirm Delete warning when doing deletions | Provide a safety net in case I accidentally delete important info |","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Teaching assistant with many students | Personalize contacts with photos | Attribute names to faces and distinguish similar names. |","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"RingoftheKing"},"content":"| `*` | detail-oriented Teaching Assistant | Add a note with additional information about the contact | remind myself of things I may need to follow up on |","lastModifiedDate":"2024-03-04"},{"lineNumber":308,"author":{"gitId":"RingoftheKing"},"content":"| `*` | Teaching assistant who tires from work | use an app with a cheerful interface | feel encouraged / at peace |","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"RingoftheKing"},"content":"| `*` | Teaching assistant | import and export contact details to/from the app | can easily shift to using this app, or another |","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"RingoftheKing"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","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":"Ragnapop"},"content":"**Use case: View all contacts**","lastModifiedDate":"2024-03-04"},{"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":"Ragnapop"},"content":"1. User requests to view all contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook shows a list of contacts added.","lastModifiedDate":"2024-03-04"},{"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":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Ragnapop"},"content":"**Use case: Add a contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Ragnapop"},"content":"1. User requests to add a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all information required to add a contact into AddressBook.","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook adds the contact with all relevant information into a list.","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"Ragnapop"},"content":"* 2a. The given information is in an incorrect format.","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Ragnapop"},"content":"* 2b. The given information is insufficient to form a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"Ragnapop"},"content":" * 2b1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"Ragnapop"},"content":"**Use case: Edit a contact\u0027s particulars**","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"Ragnapop"},"content":"1. User requests to edit a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all fields he wishes to edit about said contact,as well as the information required to edit a contact into AddressBook.","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook edits the contact by changing all the specified fields into the newly inputted information.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"Ragnapop"},"content":"* 2a. The given information is in an incorrect format.","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"Ragnapop"},"content":"**Use case: Delete a contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"Ragnapop"},"content":"1. User requests to delete a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook deletes the specified contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":397,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":403,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":404,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"Ragnapop"},"content":"**Use case: Find a specific existing contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"Ragnapop"},"content":"1. User requests to find a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook outputs the contact with all relevant information about the contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"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":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":429,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":430,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":431,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":432,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":433,"author":{"gitId":"Ragnapop"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":434,"author":{"gitId":"Ragnapop"},"content":"**Use case: Assign an existing contact to a tutorial group**","lastModifiedDate":"2024-03-04"},{"lineNumber":435,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":436,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":437,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":438,"author":{"gitId":"Ragnapop"},"content":"1. User requests to tag a specific contact to a tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":439,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook tags the contact to the tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":440,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":441,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":442,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":443,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":444,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":445,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":446,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":447,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":448,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":449,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":450,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":451,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":452,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":453,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":454,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":455,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":456,"author":{"gitId":"Ragnapop"},"content":"* 2a. The tutorial group does not yet exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":457,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":458,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook creates a new tag with the name of the tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":459,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":460,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":461,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":462,"author":{"gitId":"Ragnapop"},"content":"**Use case: Classify an existing contact (Prof, TA, Student)**","lastModifiedDate":"2024-03-04"},{"lineNumber":463,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":464,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":465,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":466,"author":{"gitId":"Ragnapop"},"content":"1. User requests to classify a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":467,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook classifies the contact as either a Professor, TA or Student.","lastModifiedDate":"2024-03-04"},{"lineNumber":468,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":469,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":470,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":471,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":472,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":473,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":474,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":475,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":476,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":477,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":478,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":479,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":480,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":481,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":482,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":483,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":484,"author":{"gitId":"Ragnapop"},"content":"* 2a. The tag does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":485,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":486,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":487,"author":{"gitId":"Ragnapop"},"content":" * 2a2. User has to request the classification again using a correct classifier","lastModifiedDate":"2024-03-04"},{"lineNumber":488,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":489,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":490,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":491,"author":{"gitId":"Ragnapop"},"content":"**Use case: schedules an event with a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":492,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":493,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":495,"author":{"gitId":"Ragnapop"},"content":"1. User requests to schedule an event with a specific contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all necessary information into AddressBook in order for the event to be scheduled.","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook creates the event and classifies it under the contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-06"},{"lineNumber":505,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":506,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":507,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":508,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-06"},{"lineNumber":509,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"Ragnapop"},"content":"* 2a. The information required is not sufficiently inputted.","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"Ragnapop"},"content":" * 2a2. User has to request the classification again using a correct classifier","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":519,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":520,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":521,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"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":525,"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":526,"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":527,"author":{"gitId":"hjuntan"},"content":"4. A novice user should be able to learn basic operations (add, delete, search entries) within 30 minutes of using the documentation.","lastModifiedDate":"2024-03-05"},{"lineNumber":528,"author":{"gitId":"hjuntan"},"content":"5. The system should respond within two seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":529,"author":{"gitId":"hjuntan"},"content":"6. The system should be backward compatible with data produced by earlier versions of the system","lastModifiedDate":"2024-03-05"},{"lineNumber":530,"author":{"gitId":"hjuntan"},"content":"7. The system should smoothly handle user input errors and system issues, providing meaningful error messages without crashing.","lastModifiedDate":"2024-03-05"},{"lineNumber":531,"author":{"gitId":"hjuntan"},"content":"8. Comply with relevant data protection regulations, Personal Data Protection Act (PDPA) in handling personal information.","lastModifiedDate":"2024-03-05"},{"lineNumber":532,"author":{"gitId":"hjuntan"},"content":"9. Adhere to recommended coding standards, such as readability, modularity, and application of design patterns, to make upgrades and maintenance simpler.","lastModifiedDate":"2024-03-05"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"Rikko1204"},"content":"* **Teaching Assistant (TA)**: A student-tutor hired by NUS. TAs are responsible for conducting tutorial lessons and assist in the students\u0027 learning whenever required.","lastModifiedDate":"2024-03-06"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":545,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":546,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":547,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"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":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"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":562,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":571,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":574,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":575,"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":576,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":578,"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":579,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":580,"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":581,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":582,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":583,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":584,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":585,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":586,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":587,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":588,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":589,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":590,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":591,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Rikko1204":1,"RingoftheKing":16,"Ragnapop":171,"hjuntan":6,"-":397}},{"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":"![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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"Rikko1204"},"content":"Format: `add id/ID n/NAME p/PHONE_NUMBER e/EMAIL [t/TAG]…​`","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":86,"author":{"gitId":"Rikko1204"},"content":"**Tip:** A person can have 0 or 1 tag","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"Rikko1204"},"content":"* `add id/E1234567 n/John Doe p/98765432 e/johnd@example.com`","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"Rikko1204"},"content":"* `add id/E7654321 n/Betsy Crowe t/student e/betsycrowe@example.com p/1234567`","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"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":109,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"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":"* `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":114,"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":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"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":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"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":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":166,"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":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":170,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":171,"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":172,"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":173,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","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":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"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":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":190,"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":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":192,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":194,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"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":199,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"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":202,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Rikko1204":4,"-":200}},{"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":"Rikko1204"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eAronaPro\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"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":{"Rikko1204":1,"-":66}},{"path":"docs/team/cheahtj.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Cheah Tze Juen\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/hjuntan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Tan Hong Jun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/ragnapop.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Loh Jin Hun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/rikko1204.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Chen Kuan Min\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/ringoftheking.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Guo YuHao Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"src/main/java/seedu/address/model/person/NusId.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":" * Represents a Person\u0027s Nusid in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidNusId(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"public class NusId {","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"NusID is of the form EXXXXXXX, and it should not be blank\";","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":" /*","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * Ensures that the input nusid is of the form: EXXXXXXX","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" public static final String VALIDATION_REGEX \u003d \"^E\\\\d{7}$\\n\";","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":" public final String value;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":" * Constructs an {@code Nusid}.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":" * @param nusid A valid nusid.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":" public NusId(String nusid) {","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":" requireNonNull(nusid);","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" checkArgument(isValidNusId(nusid), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" value \u003d nusid;","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Returns true if a given string is a valid nusid.","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" public static boolean isValidNusId(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" return value;","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"cheahTJ"},"content":" if (!(other instanceof NusId)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"cheahTJ"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"cheahTJ"},"content":" NusId otherNusid \u003d (NusId) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"cheahTJ"},"content":" return value.equals(otherNusid.value);","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"cheahTJ"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"cheahTJ"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"cheahTJ"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"cheahTJ":62}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"hjuntan"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T15-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T15-2/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":"cheahTJ"},"content":"## Arona Pro","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"* This is **a sample project given to Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"* The project simulates an ongoing software project for a desktop application (called _AronaPro_) catered for","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":" Computer Science teaching assistants who appreciate an organised and vibrant approach to query,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":" and manage an array of students and professors’ contacts with CLI.","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":" * It is **written in OOP fashion**.","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"### Main features include:","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":"#### View Contact Information","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"Description: `View` command allows you to see all the existing contacts of your students","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `view`","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"#### Add New Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"Description: `Add` command allows you to add new contacts of your students into the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `id/NUSID n/NAME p/PHONE [e/EMAIL] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":"#### Edit Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"Description: `Edit` command allows you to edit existing contacts of your students in the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `edit id/NUSID [n/NEWNAME] [p/NEWPHONE] [e/NEWEMAIL]`","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":"#### Delete Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"Description: `Delete` command allows you to delete existing contacts in the address book","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `delete id/NUSID`","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":"#### Filtering Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":"Description: `Filter` command allows you to filter desired contacts in the address book based on group ","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":"and tag specified","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `filter [n/NAME] [p/PHONE] [e/EMAIL] [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"#### Assign contacts a tutorial group","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":"Description: `Assign` command allows you to assign students into their respective tutorial groups in the ","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":"address book","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `assign id/NUSID [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"#### Add Schedule","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"Description: `Schedyle` command allows you to schedule an appointment with students","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `schedule id/NUSID d/DATE from/FROM [to/TO] [t/TAG] [r/REMARK]`","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"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":48,"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":{"cheahTJ":41,"hjuntan":1,"-":6}},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"### Cheah Tze Juen","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/cheahtj.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"[[github](https://github.com/cheahTJ)]","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/cheahtj.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"* Roles: Team Lead","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":" * Dedicates tasks among team and facilitate coordination among team members","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"### Tan Hong Jun","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/hjuntan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/hjuntan)]","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/hjuntan.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":"* Role: Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that all documentation are up-to-date and are specific to the user","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":"### Loh Jin Hun","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"hjuntan"},"content":"\u003cimg src\u003d\"images/ragnapop.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/Ragnapop)] [[portfolio](team/ragnapop.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that all features are properly tested, even on edge cases","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":"### Chen Kuan Min","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"hjuntan"},"content":"\u003cimg src\u003d\"images/rikko1204.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/Rikko1204)]","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/rikko1204.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"cheahTJ"},"content":"* Role: Scheduling and tracking","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that the team is on pace with the 2 weeks sprint and helps assign","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"cheahTJ"},"content":" task equally to members","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"cheahTJ"},"content":"### Guo Yuhao","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"cheahTJ"},"content":"\u003cimg src\u003d\"images/ringoftheking.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"cheahTJ"},"content":"[[github](http://github.com/RingoftheKing)]","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"cheahTJ"},"content":"[[portfolio](team/ringoftheking.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":63,"author":{"gitId":"cheahTJ"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":64,"author":{"gitId":"cheahTJ"},"content":"* Responsibilities: Ensures that the team is focussed on the individual task and is able to deliver the intended feature","lastModifiedDate":"2024-03-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":31,"hjuntan":2,"-":32}},{"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":"hjuntan"},"content":"* Tech-savvy university Computer Science teaching assistants","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"hjuntan"},"content":"* manages an array of students and professors’ contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"hjuntan"},"content":"* appreciates an organized and vibrant approach to query, and manage contacts with CLI","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":"-"},"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":"RingoftheKing"},"content":"|----------|-------------------------------------------------------------------------------|--------------------------------------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | add a new student, prof, TA | know how to contact them |","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | find a student by name or class | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant | Group students into classes | know which class my student is in |","lastModifiedDate":"2024-03-04"},{"lineNumber":299,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching assistant | find my supervisor(s) | Report any admin issues my students would raise |","lastModifiedDate":"2024-03-04"},{"lineNumber":300,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | University student with different friend groups | Tag or categorize my contacts | Search by the friend groups I\u0027m concerned with |","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant who wants to meet up with Profs and students | Schedule events to do so | remind myself to meet up or know my free times. |","lastModifiedDate":"2024-03-04"},{"lineNumber":302,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant with important people to report to or stay in contact with | pin important contacts | |","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"RingoftheKing"},"content":"| `* * *` | Teaching Assistant who needs to announce information to his students | copy a (group of) student(s)\u0027 contact info onto my clipboard | announce a message efficiently to many students |","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Forgetful Teaching Assistant | A check for addition of duplicate contacts | can reduce clutter of my list |","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Teaching assistant who might mistype | Have a Confirm Delete warning when doing deletions | Provide a safety net in case I accidentally delete important info |","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"RingoftheKing"},"content":"| `* *` | Teaching assistant with many students | Personalize contacts with photos | Attribute names to faces and distinguish similar names. |","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"RingoftheKing"},"content":"| `*` | detail-oriented Teaching Assistant | Add a note with additional information about the contact | remind myself of things I may need to follow up on |","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"RingoftheKing"},"content":"| `*` | Teaching assistant who tires from work | use an app with a cheerful interface | feel encouraged / at peace |","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"RingoftheKing"},"content":"| `*` | Teaching assistant | import and export contact details to/from the app | can easily shift to using this app, or another |","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"RingoftheKing"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"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":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"Ragnapop"},"content":"**Use case: View all contacts**","lastModifiedDate":"2024-03-04"},{"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":"Ragnapop"},"content":"1. User requests to view all contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook shows a list of contacts added.","lastModifiedDate":"2024-03-04"},{"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":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"Ragnapop"},"content":"**Use case: Add a contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Ragnapop"},"content":"1. User requests to add a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all information required to add a contact into AddressBook.","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook adds the contact with all relevant information into a list.","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"Ragnapop"},"content":"* 2a. The given information is in an incorrect format.","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"Ragnapop"},"content":"* 2b. The given information is insufficient to form a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Ragnapop"},"content":" * 2b1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"Ragnapop"},"content":"**Use case: Edit a contact\u0027s particulars**","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"Ragnapop"},"content":"1. User requests to edit a contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all fields he wishes to edit about said contact,as well as the information required to edit a contact into AddressBook.","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook edits the contact by changing all the specified fields into the newly inputted information.","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"Ragnapop"},"content":"* 2a. The given information is in an incorrect format.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"Ragnapop"},"content":"**Use case: Delete a contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"Ragnapop"},"content":"1. User requests to delete a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook deletes the specified contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":395,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":400,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"Ragnapop"},"content":"**Use case: Find a specific existing contact**","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"Ragnapop"},"content":"1. User requests to find a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook outputs the contact with all relevant information about the contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":422,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":423,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":426,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":431,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":432,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":433,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":434,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":435,"author":{"gitId":"Ragnapop"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":436,"author":{"gitId":"Ragnapop"},"content":"**Use case: Assign an existing contact to a tutorial group**","lastModifiedDate":"2024-03-04"},{"lineNumber":437,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":438,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":439,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":440,"author":{"gitId":"Ragnapop"},"content":"1. User requests to tag a specific contact to a tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":441,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook tags the contact to the tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":442,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":443,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":444,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":445,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":446,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":447,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":448,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":449,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":450,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":451,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":452,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":453,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":454,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":455,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":456,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":457,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":458,"author":{"gitId":"Ragnapop"},"content":"* 2a. The tutorial group does not yet exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":459,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":460,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook creates a new tag with the name of the tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":461,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":462,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":463,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":464,"author":{"gitId":"Ragnapop"},"content":"**Use case: Classify an existing contact (Prof, TA, Student)**","lastModifiedDate":"2024-03-04"},{"lineNumber":465,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":466,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":467,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":468,"author":{"gitId":"Ragnapop"},"content":"1. User requests to classify a specific contact.","lastModifiedDate":"2024-03-04"},{"lineNumber":469,"author":{"gitId":"Ragnapop"},"content":"2. AddressBook classifies the contact as either a Professor, TA or Student.","lastModifiedDate":"2024-03-04"},{"lineNumber":470,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":471,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":472,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":473,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":474,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":475,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":476,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-04"},{"lineNumber":477,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":478,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":479,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":480,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":481,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":482,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":483,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":484,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":485,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":486,"author":{"gitId":"Ragnapop"},"content":"* 2a. The tag does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":487,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":488,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":489,"author":{"gitId":"Ragnapop"},"content":" * 2a2. User has to request the classification again using a correct classifier","lastModifiedDate":"2024-03-04"},{"lineNumber":490,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":491,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":492,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":493,"author":{"gitId":"Ragnapop"},"content":"**Use case: schedules an event with a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":495,"author":{"gitId":"Ragnapop"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"Ragnapop"},"content":"1. User requests to schedule an event with a specific contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"Ragnapop"},"content":"2. User inputs all necessary information into AddressBook in order for the event to be scheduled.","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"Ragnapop"},"content":"3. AddressBook creates the event and classifies it under the contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"Ragnapop"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"Ragnapop"},"content":"* 1a. User uses the wrong format in his request.","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":505,"author":{"gitId":"Ragnapop"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":506,"author":{"gitId":"Ragnapop"},"content":" * 1a2. User uses the correct format as shown in the error message for his request.","lastModifiedDate":"2024-03-06"},{"lineNumber":507,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":508,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":509,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"Ragnapop"},"content":"* 2a. The contact does not exist.","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"Ragnapop"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"Ragnapop"},"content":"* 2a. The information required is not sufficiently inputted.","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"Ragnapop"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":519,"author":{"gitId":"Ragnapop"},"content":" * 2a2. User has to request the classification again using a correct classifier","lastModifiedDate":"2024-03-06"},{"lineNumber":520,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":521,"author":{"gitId":"Ragnapop"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":522,"author":{"gitId":"Ragnapop"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"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":527,"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":528,"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":529,"author":{"gitId":"hjuntan"},"content":"4. A novice user should be able to learn basic operations (add, delete, search entries) within 30 minutes of using the documentation.","lastModifiedDate":"2024-03-05"},{"lineNumber":530,"author":{"gitId":"hjuntan"},"content":"5. The system should respond within two seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":531,"author":{"gitId":"hjuntan"},"content":"6. The system should be backward compatible with data produced by earlier versions of the system","lastModifiedDate":"2024-03-05"},{"lineNumber":532,"author":{"gitId":"hjuntan"},"content":"7. The system should smoothly handle user input errors and system issues, providing meaningful error messages without crashing.","lastModifiedDate":"2024-03-05"},{"lineNumber":533,"author":{"gitId":"hjuntan"},"content":"8. Comply with relevant data protection regulations, Personal Data Protection Act (PDPA) in handling personal information.","lastModifiedDate":"2024-03-05"},{"lineNumber":534,"author":{"gitId":"hjuntan"},"content":"9. Adhere to recommended coding standards, such as readability, modularity, and application of design patterns, to make upgrades and maintenance simpler.","lastModifiedDate":"2024-03-05"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"Rikko1204"},"content":"* **Teaching Assistant (TA)**: A student-tutor hired by NUS. TAs are responsible for conducting tutorial lessons and assist in the students\u0027 learning whenever required.","lastModifiedDate":"2024-03-06"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":547,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":548,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":549,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"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":560,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"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":564,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":571,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":574,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":575,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"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":578,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":579,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":580,"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":581,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":582,"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":583,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":584,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":585,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":586,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":587,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":588,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":589,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":590,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":591,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":592,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":593,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Rikko1204":1,"RingoftheKing":16,"Ragnapop":171,"hjuntan":9,"-":396}},{"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":"![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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"Rikko1204"},"content":"Format: `add id/ID n/NAME p/PHONE_NUMBER e/EMAIL [t/TAG]…​`","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":86,"author":{"gitId":"Rikko1204"},"content":"**Tip:** A person can have 0 or 1 tag","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"Rikko1204"},"content":"* `add id/E1234567 n/John Doe p/98765432 e/johnd@example.com`","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"Rikko1204"},"content":"* `add id/E7654321 n/Betsy Crowe t/student e/betsycrowe@example.com p/1234567`","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"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":109,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"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":"* `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":114,"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":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"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":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"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":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":166,"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":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":170,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":171,"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":172,"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":173,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","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":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"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":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":190,"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":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":192,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":194,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"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":199,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"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":202,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Rikko1204":4,"-":200}},{"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":"Rikko1204"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eAronaPro\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"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":{"Rikko1204":1,"-":66}},{"path":"docs/team/cheahtj.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Cheah Tze Juen\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/hjuntan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Tan Hong Jun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/ragnapop.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Loh Jin Hun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/rikko1204.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Chen Kuan Min\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"docs/team/ringoftheking.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":" title: \"Guo YuHao Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"### Project: AronaPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":"AronaPro is a desktop application designed for tech-savvy university Computer Science teaching assistants,","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":"enabling them to enjoy an organised and vibrant approach to query, and manage an array of students and professors’","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"contacts via the Command Line Interface (CLI).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":"My contributions to the project are listed below","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"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-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"cheahTJ":48}},{"path":"src/main/java/seedu/address/model/person/NusId.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"cheahTJ"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"cheahTJ"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"cheahTJ"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"cheahTJ"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"cheahTJ"},"content":" * Represents a Person\u0027s Nusid in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"cheahTJ"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidNusId(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"cheahTJ"},"content":"public class NusId {","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"cheahTJ"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"NusID is of the form EXXXXXXX, and it should not be blank\";","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"cheahTJ"},"content":" /*","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"cheahTJ"},"content":" * Ensures that the input nusid is of the form: EXXXXXXX","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"cheahTJ"},"content":" public static final String VALIDATION_REGEX \u003d \"^E\\\\d{7}$\\n\";","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":" public final String value;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":" * Constructs an {@code Nusid}.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":" * @param nusid A valid nusid.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":" public NusId(String nusid) {","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":" requireNonNull(nusid);","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":" checkArgument(isValidNusId(nusid), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":" value \u003d nusid;","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":" * Returns true if a given string is a valid nusid.","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":" public static boolean isValidNusId(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"cheahTJ"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"cheahTJ"},"content":" return value;","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"cheahTJ"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"cheahTJ"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"cheahTJ"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"cheahTJ"},"content":" if (!(other instanceof NusId)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"cheahTJ"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"cheahTJ"},"content":" NusId otherNusid \u003d (NusId) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"cheahTJ"},"content":" return value.equals(otherNusid.value);","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"cheahTJ"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"cheahTJ"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"cheahTJ"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"cheahTJ"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"cheahTJ"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"cheahTJ":62}}] diff --git a/AY2324S2-CS2103T-T15-2_tp_master/commits.json b/AY2324S2-CS2103T-T15-2_tp_master/commits.json index a7299f1a..07366bf2 100644 --- a/AY2324S2-CS2103T-T15-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T15-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"cheahTJ":[{"date":"2024-03-05","commitResults":[{"hash":"6aa8e4b987ee24b281f6b775c458cde82c6c9e7b","isMergeCommit":false,"messageTitle":"Edit READMe and AboutUs md files","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":304,"deletions":38}}},{"hash":"b3d896e6a963cfb67ad9a6455474e0f49c5fa482","isMergeCommit":false,"messageTitle":"Fix CI issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"1b032295a55797d4f976ec6f69d8ac7ca6c6aa2f","isMergeCommit":false,"messageTitle":"Edit README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":5}}},{"hash":"173b7df17e870e38ed0e91f86eb761dd6583554a","isMergeCommit":false,"messageTitle":"Create Nusid class to standardise its usage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":58,"deletions":0}}},{"hash":"be55639426b66a66398cb451156497c61075652e","isMergeCommit":false,"messageTitle":"Fix CI issue for Nusid class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":2}}},{"hash":"bc93ebfa00c365269e6b8576c5ed6b51328ae651","isMergeCommit":false,"messageTitle":"Rename Nusid class to NusId class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":4}}},{"hash":"5042b0450aac5a92996b7f4221d2973d9db93eb5","isMergeCommit":false,"messageTitle":"Rename NusId.class file","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":0,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6db48455016f0c2ab57f350f8ee8333cac44a8ee","isMergeCommit":false,"messageTitle":"Edit README.md file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}}]}],"Rikko1204":[{"date":"2024-02-28","commitResults":[{"hash":"9c0f64872538fe837c0ea08b11c2e5d910257d6c","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T15-2/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"2f9d1510235b6e6a081ac022d3e186c38096ad60","isMergeCommit":false,"messageTitle":"Add MarkBind config","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"40f51af29c3bc5b49329f4959d7f83db4347c2fc","isMergeCommit":true,"messageTitle":"Merge pull request #3 from Rikko1204/master","messageBody":"Add MarkBind config","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"d29bb35976aeeccff228a14ebc18ec7edea2334e","isMergeCommit":true,"messageTitle":"Merge pull request #13 from hjuntan/edit-Dev-Guide","messageBody":"Update Non-Functional Requirements in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"18f87bd8fe98aa8640117e03a1210609c315df62","isMergeCommit":false,"messageTitle":"Update Glossary in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"72e837bfc57da46d8fee8a03f651ac3c7369e6e7","isMergeCommit":true,"messageTitle":"Merge pull request #17 from cheahTJ/delete-feature","messageBody":"Create NusId class","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"7a95f1351b3141fe8b146b702e0334e986ac2798","isMergeCommit":true,"messageTitle":"Merge pull request #19 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Added NUSID class","fileTypesAndContributionMap":{}}]}],"RingoftheKing":[{"date":"2024-03-04","commitResults":[{"hash":"55c3ceb840b378f9e719ec8e18f2fa7f475abd41","isMergeCommit":false,"messageTitle":"Update User Stories in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":9}}}]}],"Ragnapop":[{"date":"2024-03-04","commitResults":[{"hash":"3e48f01e00da32e22c95310d2dc3fc53e449fe64","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":162,"deletions":10}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d665df3b29b4eb95d61fdec4d1c69d6d59dcfb36","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":0}}}]}],"hjuntan":[{"date":"2024-03-05","commitResults":[{"hash":"3468524824ca48effada3aec0c987ba152171707","isMergeCommit":true,"messageTitle":"Merge pull request #11 from RingoftheKing/edit-Dev-Guide","messageBody":"Update User Stories in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"d9e95a54d7c9c37572a9181cc5c5bd2cadaaaffa","isMergeCommit":false,"messageTitle":"Update Non-Functional Requirements in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"5f6c18e9882d345d15ea92f821fd49d92c0fb1b8","isMergeCommit":true,"messageTitle":"Merge pull request #12 from cheahTJ/master","messageBody":"Edit READMe and AboutUs md files","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"a7f51093098a05846101b378a2412b3220e6807f","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Rikko1204/edit-DG","messageBody":"Update Glossary in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"196e271d363cea2299c43f697230b9e92c0c2d25","isMergeCommit":true,"messageTitle":"Merge pull request #10 from Ragnapop/edit-Dev-Guide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"44375cad6b242709e068f7781ca6637e17a99c18","isMergeCommit":true,"messageTitle":"Merge pull request #22 from cheahTJ/documentation","messageBody":"Finetune README","fileTypesAndContributionMap":{}},{"hash":"52c6f2f8039e9cca676814d0ff6ed13349059566","isMergeCommit":true,"messageTitle":"Merge pull request #23 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Documentation 1.1","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"cheahTJ":{"docs":314,"functional-code":62,"test-code":0},"Rikko1204":{"docs":6,"functional-code":0,"test-code":0},"RingoftheKing":{"docs":16,"functional-code":0,"test-code":0},"Ragnapop":{"docs":171,"functional-code":0,"test-code":0},"hjuntan":{"docs":6,"functional-code":0,"test-code":0}},"authorContributionVariance":{"cheahTJ":8100.816,"Rikko1204":8.066326,"RingoftheKing":59.693882,"Ragnapop":1965.0612,"hjuntan":4.244898},"authorDisplayNameMap":{"cheahTJ":"CS2103T-T15-2 CHEA..JUEN","Rikko1204":"CS2103T-T15-2 CHEN.. MIN","RingoftheKing":"CS2103T-T15-2 GUO ..UHAO","Ragnapop":"CS2103T-T15-2 LOH .. HUN","hjuntan":"CS2103T-T15-2 TAN .. JUN"}} +{"authorDailyContributionsMap":{"cheahTJ":[{"date":"2024-03-05","commitResults":[{"hash":"6aa8e4b987ee24b281f6b775c458cde82c6c9e7b","isMergeCommit":false,"messageTitle":"Edit READMe and AboutUs md files","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":304,"deletions":38}}},{"hash":"b3d896e6a963cfb67ad9a6455474e0f49c5fa482","isMergeCommit":false,"messageTitle":"Fix CI issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"1b032295a55797d4f976ec6f69d8ac7ca6c6aa2f","isMergeCommit":false,"messageTitle":"Edit README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":5}}},{"hash":"173b7df17e870e38ed0e91f86eb761dd6583554a","isMergeCommit":false,"messageTitle":"Create Nusid class to standardise its usage","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":58,"deletions":0}}},{"hash":"be55639426b66a66398cb451156497c61075652e","isMergeCommit":false,"messageTitle":"Fix CI issue for Nusid class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":2}}},{"hash":"bc93ebfa00c365269e6b8576c5ed6b51328ae651","isMergeCommit":false,"messageTitle":"Rename Nusid class to NusId class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":4}}},{"hash":"5042b0450aac5a92996b7f4221d2973d9db93eb5","isMergeCommit":false,"messageTitle":"Rename NusId.class file","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":0,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6db48455016f0c2ab57f350f8ee8333cac44a8ee","isMergeCommit":false,"messageTitle":"Edit README.md file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}}]}],"Rikko1204":[{"date":"2024-02-28","commitResults":[{"hash":"9c0f64872538fe837c0ea08b11c2e5d910257d6c","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T15-2/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"2f9d1510235b6e6a081ac022d3e186c38096ad60","isMergeCommit":false,"messageTitle":"Add MarkBind config","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"40f51af29c3bc5b49329f4959d7f83db4347c2fc","isMergeCommit":true,"messageTitle":"Merge pull request #3 from Rikko1204/master","messageBody":"Add MarkBind config","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"d29bb35976aeeccff228a14ebc18ec7edea2334e","isMergeCommit":true,"messageTitle":"Merge pull request #13 from hjuntan/edit-Dev-Guide","messageBody":"Update Non-Functional Requirements in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"18f87bd8fe98aa8640117e03a1210609c315df62","isMergeCommit":false,"messageTitle":"Update Glossary in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"72e837bfc57da46d8fee8a03f651ac3c7369e6e7","isMergeCommit":true,"messageTitle":"Merge pull request #17 from cheahTJ/delete-feature","messageBody":"Create NusId class","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"7a95f1351b3141fe8b146b702e0334e986ac2798","isMergeCommit":true,"messageTitle":"Merge pull request #19 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Added NUSID class","fileTypesAndContributionMap":{}}]}],"RingoftheKing":[{"date":"2024-03-04","commitResults":[{"hash":"55c3ceb840b378f9e719ec8e18f2fa7f475abd41","isMergeCommit":false,"messageTitle":"Update User Stories in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":9}}}]}],"Ragnapop":[{"date":"2024-03-04","commitResults":[{"hash":"3e48f01e00da32e22c95310d2dc3fc53e449fe64","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":162,"deletions":10}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d665df3b29b4eb95d61fdec4d1c69d6d59dcfb36","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":0}}}]}],"hjuntan":[{"date":"2024-03-05","commitResults":[{"hash":"3468524824ca48effada3aec0c987ba152171707","isMergeCommit":true,"messageTitle":"Merge pull request #11 from RingoftheKing/edit-Dev-Guide","messageBody":"Update User Stories in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"d9e95a54d7c9c37572a9181cc5c5bd2cadaaaffa","isMergeCommit":false,"messageTitle":"Update Non-Functional Requirements in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"5f6c18e9882d345d15ea92f821fd49d92c0fb1b8","isMergeCommit":true,"messageTitle":"Merge pull request #12 from cheahTJ/master","messageBody":"Edit READMe and AboutUs md files","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"a7f51093098a05846101b378a2412b3220e6807f","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Rikko1204/edit-DG","messageBody":"Update Glossary in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"196e271d363cea2299c43f697230b9e92c0c2d25","isMergeCommit":true,"messageTitle":"Merge pull request #10 from Ragnapop/edit-Dev-Guide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"44375cad6b242709e068f7781ca6637e17a99c18","isMergeCommit":true,"messageTitle":"Merge pull request #22 from cheahTJ/documentation","messageBody":"Finetune README","fileTypesAndContributionMap":{}},{"hash":"52c6f2f8039e9cca676814d0ff6ed13349059566","isMergeCommit":true,"messageTitle":"Merge pull request #23 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Documentation 1.1","fileTypesAndContributionMap":{}},{"hash":"39085e81b04b1da380b83e0549e8fbdd752bbbe2","isMergeCommit":false,"messageTitle":"Tweak missing criterias","messageBody":"Group images, CI status are updated to the correct format.\nProject scope is updated to fit the tp project.\n","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":5}}},{"hash":"a34d65e8fd5b8f90822147e0926e6a0e21534258","isMergeCommit":true,"messageTitle":"Merge pull request #25 from hjuntan/documentation","messageBody":"Documentation","fileTypesAndContributionMap":{}},{"hash":"a71646d2d34723d2343cb794b25c003c8ba0295a","isMergeCommit":true,"messageTitle":"Merge pull request #26 from AY2324S2-CS2103T-T15-2/documentation_1.1","messageBody":"Documentation 1.1","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"cheahTJ":{"docs":312,"functional-code":62,"test-code":0},"Rikko1204":{"docs":6,"functional-code":0,"test-code":0},"RingoftheKing":{"docs":16,"functional-code":0,"test-code":0},"Ragnapop":{"docs":171,"functional-code":0,"test-code":0},"hjuntan":{"docs":12,"functional-code":0,"test-code":0}},"authorContributionVariance":{"cheahTJ":8100.816,"Rikko1204":8.066326,"RingoftheKing":59.693882,"Ragnapop":1965.0612,"hjuntan":12.816325},"authorDisplayNameMap":{"cheahTJ":"CS2103T-T15-2 CHEA..JUEN","Rikko1204":"CS2103T-T15-2 CHEN.. MIN","RingoftheKing":"CS2103T-T15-2 GUO ..UHAO","Ragnapop":"CS2103T-T15-2 LOH .. HUN","hjuntan":"CS2103T-T15-2 TAN .. JUN"}} diff --git a/AY2324S2-CS2103T-T15-4_tp_master/authorship.json b/AY2324S2-CS2103T-T15-4_tp_master/authorship.json index 7722b6ca..d83b7baa 100644 --- a/AY2324S2-CS2103T-T15-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T15-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"azumieflare"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T15-4/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T15-4/tp/actions)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"azumieflare"},"content":"# TaskMasterPro","lastModifiedDate":"2024-03-05"},{"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":"azumieflare"},"content":"TaskMasterPro is a desktop application designed to aid managers with managing employee\u0027s tasks.","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"azumieflare"},"content":"### Features","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"azumieflare"},"content":"* Add or remove","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"azumieflare"},"content":" * Employees","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"azumieflare"},"content":" * Tasks","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"azumieflare"},"content":"* Assign tasks to employees","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"azumieflare"},"content":"* List all information","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"azumieflare"},"content":"* Mark tasks as completed or not completed","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"azumieflare"},"content":"* Save and Load","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"azumieflare"},"content":"\u003c!-- Add more if needed --\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"azumieflare"},"content":"# Contents","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"azumieflare"},"content":"- [Feature breakdown](#feature-breakdown)","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"azumieflare"},"content":"- [How to use](#how-to-use)","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"azumieflare"},"content":"- [Credits](#credits)","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"azumieflare"},"content":"# Feature Breakdown","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"azumieflare"},"content":"```add``` - Adds an employee to TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"azumieflare"},"content":"```add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAGS]```","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"azumieflare"},"content":"```delete``` - Deletes an employee from TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"azumieflare"},"content":"```delete EMPLOYEE_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"azumieflare"},"content":"```listemployees``` - Lists all employee recorded in TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"azumieflare"},"content":"```task``` - Creates a task and add it to TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"azumieflare"},"content":"```task TASK_DESCRIPTION```","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"azumieflare"},"content":"```deletetask``` - Deletes a task from TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"azumieflare"},"content":"```deletetask TASK_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"azumieflare"},"content":"```listtasks``` - Lists all tasks recorded in TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"azumieflare"},"content":"```assigntask``` - Assigns a task to an employee \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"azumieflare"},"content":"```assigntask t/TASK_ID e/EMPLOYEE_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"azumieflare"},"content":"```removetask``` - Removes a task from an employee \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"azumieflare"},"content":"```removetask t/ TASK_ID e/EMPLOYEE_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"azumieflare"},"content":"```listassignments``` - Lists all tasks and employees assigned to them \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"azumieflare"},"content":"```mark``` - Marks a task as completed \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"azumieflare"},"content":"```mark TASK_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"azumieflare"},"content":"```unmark``` - Marks a task as not completed \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"azumieflare"},"content":"```unmark TASK_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"azumieflare"},"content":"```save``` - Saves the current state of TaskMasterPro into a save file \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"azumieflare"},"content":"\u003c!-- load? --\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"azumieflare"},"content":"# How to use","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"azumieflare"},"content":"Down the .jar file from releases \u003c!-- TODO --\u003e and run the command \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"azumieflare"},"content":"```java -jar TaskMasterPro.jar```","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":63,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":64,"author":{"gitId":"azumieflare"},"content":"# Credits","lastModifiedDate":"2024-03-05"},{"lineNumber":65,"author":{"gitId":"azumieflare"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"azumieflare":62,"-":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":"-"},"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":"gavin331"},"content":"### Gavin Goh","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"gavin331"},"content":"\u003cimg src\u003d\"images/gavin331.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"gavin331"},"content":"[[github](http://github.com/gavin331)]","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"gavin331"},"content":"[[portfolio](team/gavingoh.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"gavin331"},"content":"* Role: Team Member","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"gavin331"},"content":"* Responsibilities: Deliver the project tasks on time and ensure the quality of the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"azumieflare"},"content":"### John Chan","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"azumieflare"},"content":"\u003cimg src\u003d\"images/azumieflare.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"azumieflare"},"content":"[[github](http://github.com/azumieflare)] [[portfolio](team/azumieflare.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"azumieflare"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"azumieflare"},"content":"* Responsibilities: Ensuring project deliverables are done on time and in the right format.","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"BryanL2303"},"content":"### Bryan Lee","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"BryanL2303"},"content":"\u003cimg src\u003d\"images/bryanl2303.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"BryanL2303"},"content":"[[github](http://github.com/BryanL2303)]","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"BryanL2303"},"content":"[[portfolio](team/bryanlee.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"BryanL2303"},"content":"* Role: Scheduling and tracking","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"BryanL2303"},"content":"* Responsibilities: In charge of defining, assigning, and tracking project tasks","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"johnyoozhengxian"},"content":"### John Yoo","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"johnyoozhengxian"},"content":"\u003cimg src\u003d\"images/johnyoozhengxian.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"johnyoozhengxian"},"content":"[[github](http://github.com/johnyoozhengxian)]","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"johnyoozhengxian"},"content":"[[portfolio](team/johnyoozhengxian.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"BryanL2303":6,"azumieflare":5,"gavin331":6,"-":28,"johnyoozhengxian":4}},{"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":"BryanL2303"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-05"},{"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":"azumieflare"},"content":"**Target user profile**: Managers who","lastModifiedDate":"2024-03-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"azumieflare"},"content":"* manage many employees","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"azumieflare"},"content":"* prefers command line input ","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"azumieflare"},"content":"* comfortable with manually editing save file ","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"azumieflare"},"content":"**Value proposition**: manage employees faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-07"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"BryanL2303"},"content":"|----------| ------------------------------------------ |----------------------------------------------|-------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | add a new person | keep a person on record |","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | list all recorded persons | locate details of all persons in a list |","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | add a new task | keep upcoming tasks on record |","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | delete a task | remove entries that I no longer need |","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | list all recorded tasks | locate details of all tasks in a list |","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | assign a person to a tasks | keep track of who is supposed to contribute to a task |","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | unassign a person from a task | update changes in manpower allocation |","lastModifiedDate":"2024-03-05"},{"lineNumber":287,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | list all tasks with their assigned employees | locate details of all tasks while seeing who are assigned to them |","lastModifiedDate":"2024-03-05"},{"lineNumber":288,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | mark a task as done | keep track of task completion |","lastModifiedDate":"2024-03-05"},{"lineNumber":289,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | unmark a marked task | undo wrongly marked tasks |","lastModifiedDate":"2024-03-05"},{"lineNumber":290,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | save current data | keep track of all data even after exiting |","lastModifiedDate":"2024-03-05"},{"lineNumber":291,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | load saved data | use the data that was saved previously |","lastModifiedDate":"2024-03-05"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"BryanL2303"},"content":"*{More to be added for v1.3}*","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"BryanL2303"},"content":"(For all use cases below, the **System** is the `TaskMasterPro` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"BryanL2303"},"content":"2. TaskMasterPro shows a list of persons with their ids","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"BryanL2303"},"content":"3. User requests to delete a specific person in the list by their id","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"BryanL2303"},"content":"4. TaskMasterPro deletes the person","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"BryanL2303"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"BryanL2303"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":317,"author":{"gitId":"BryanL2303"},"content":"* 3a. The given id is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"BryanL2303"},"content":" * 3a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"BryanL2303"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"BryanL2303"},"content":"**Use case: Delete a task**","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"BryanL2303"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"BryanL2303"},"content":"1. User requests to list tasks","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"BryanL2303"},"content":"2. TaskMasterPro shows a list of tasks with their ids","lastModifiedDate":"2024-03-05"},{"lineNumber":329,"author":{"gitId":"BryanL2303"},"content":"3. User requests to delete a specific task in the list by their id","lastModifiedDate":"2024-03-05"},{"lineNumber":330,"author":{"gitId":"BryanL2303"},"content":"4. TaskMasterPro deletes the task","lastModifiedDate":"2024-03-05"},{"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":"-"},"content":"* 2a. The list is empty.","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":"BryanL2303"},"content":"* 3a. The given id is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"BryanL2303"},"content":" * 3a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"BryanL2303"},"content":"**Use case: Assign/unassign a person to a task**","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"BryanL2303"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"BryanL2303"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"BryanL2303"},"content":"2. TaskMasterPro shows a list of persons with their ids ","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"BryanL2303"},"content":"3. User requests to list tasks ","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"BryanL2303"},"content":"4. TaskMasterPro shows a list of tasks with their ids ","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"BryanL2303"},"content":"5. User requests to assign/un-assign a specific person in the person list by their id to a specific task in the task list by its id","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"BryanL2303"},"content":"6. TaskMasterPro assigns/un-assigns the person to the task","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"BryanL2303"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"BryanL2303"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"BryanL2303"},"content":"* 4a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":367,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"BryanL2303"},"content":"* 5a. Any given id is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"BryanL2303"},"content":" * 5a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"BryanL2303"},"content":" Use case resumes at step 2/4.","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"gavin331"},"content":"**Use case: Mark/unmark a task as done/not done**","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"gavin331"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"gavin331"},"content":"1. User requests to list tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"gavin331"},"content":"2. TaskMasterPro shows a list of tasks with their ids","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"gavin331"},"content":"3. User requests to mark/unmark a specific task in the list by their id as done/not done","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"gavin331"},"content":"4. TaskMasterPro marks/unmarks that task as done/not done.","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"gavin331"},"content":"* 3a. The given id is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"gavin331"},"content":" * 3a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"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":403,"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":404,"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":405,"author":{"gitId":"gavin331"},"content":"4. Should be able to handle a corrupted data file without crashing.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":412,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"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":{"BryanL2303":73,"azumieflare":5,"gavin331":11,"-":376}},{"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":"BryanL2303"},"content":"TaskMasterPro is a **desktop app for managing team members and group tasks, 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, TaskMasterPro can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-04"},{"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":"BryanL2303"},"content":"## This section to be done after v1.2 is released","lastModifiedDate":"2024-03-04"},{"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":"-"},"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":" * `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":"gavin331"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-03-06"},{"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":"gavin331"},"content":"### Adding an employee: `add`","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"gavin331"},"content":"Adds an employee to TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"gavin331"},"content":"Make sure that your parameter\u0027s formats are valid!","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"gavin331"},"content":"* `add n/AikenDueet p/12311231 e/aiken@example.com a/Dueet street, block 123, #01-01`","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"gavin331"},"content":"* `add n/Ben Diddle t/friend e/bendiddle@example.com a/Newgate Prison p/21092109 t/criminal`","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"gavin331"},"content":"### Listing all employees: `list`","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":90,"author":{"gitId":"gavin331"},"content":"Shows a list of all employees in TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"gavin331"},"content":"Format: `listemployees`","lastModifiedDate":"2024-03-06"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"gavin331"},"content":"### Deleting an employee: `delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":96,"author":{"gitId":"gavin331"},"content":"Deletes the specified employee from TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":98,"author":{"gitId":"gavin331"},"content":"Format: `delete EMPLOYEE_ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":100,"author":{"gitId":"gavin331"},"content":"* The `EMPLOYEE_ID` refers to the index number shown in the displayed employee list.","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"gavin331"},"content":" Make sure that its valid!","lastModifiedDate":"2024-03-06"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":104,"author":{"gitId":"gavin331"},"content":"* `listemployees` followed by `delete 3` deletes the employee with id 3 in TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"BryanL2303"},"content":"### Adding a task: `task`","lastModifiedDate":"2024-03-04"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"gavin331"},"content":"Adds a task to TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"BryanL2303"},"content":"Format: `task TASK_DESCRIPTION`","lastModifiedDate":"2024-03-04"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"BryanL2303"},"content":"The description for the task is required and can be any length with spaces in between","lastModifiedDate":"2024-03-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"BryanL2303"},"content":"* `task Weekly meeting`","lastModifiedDate":"2024-03-04"},{"lineNumber":118,"author":{"gitId":"BryanL2303"},"content":"* `task Submitting report`","lastModifiedDate":"2024-03-04"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"BryanL2303"},"content":"### Listing all tasks : `listtasks`","lastModifiedDate":"2024-03-04"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"gavin331"},"content":"Shows a list of all tasks in TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"BryanL2303"},"content":"Format: `listtasks`","lastModifiedDate":"2024-03-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"BryanL2303"},"content":"### Deleting a task : `deletetask TASK_ID`","lastModifiedDate":"2024-03-04"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"gavin331"},"content":"Deletes the specified task from TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"BryanL2303"},"content":"Format: `deletetask TASK_ID`","lastModifiedDate":"2024-03-04"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"BryanL2303"},"content":"* Deletes the task with the specified `TASK_ID`.","lastModifiedDate":"2024-03-04"},{"lineNumber":133,"author":{"gitId":"BryanL2303"},"content":"* The task id refers to the number shown in the displayed task list.","lastModifiedDate":"2024-03-04"},{"lineNumber":134,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"gavin331"},"content":"* `listtasks` followed by `deletetask 2` deletes the task with id 2 in TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"johnyoozhengxian"},"content":"### Assign a task to employee : `assigntask`","lastModifiedDate":"2024-03-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":141,"author":{"gitId":"johnyoozhengxian"},"content":"Assigns a task object to employee.","lastModifiedDate":"2024-03-06"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":143,"author":{"gitId":"johnyoozhengxian"},"content":"Format: `assigntask t/TASK_ID e/EMPLOYEE_ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":145,"author":{"gitId":"johnyoozhengxian"},"content":"* Assigns a task object with id `TASK_ID` to an employee with id `EMPLOYEE_ID`.","lastModifiedDate":"2024-03-06"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":147,"author":{"gitId":"johnyoozhengxian"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":148,"author":{"gitId":"johnyoozhengxian"},"content":"* `assigntask` followed by `2 3` assigns task object with id 2 to an employee with id 3.","lastModifiedDate":"2024-03-06"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":150,"author":{"gitId":"johnyoozhengxian"},"content":"### Mark a task : `mark`","lastModifiedDate":"2024-03-06"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":152,"author":{"gitId":"johnyoozhengxian"},"content":"Marks a task as done.","lastModifiedDate":"2024-03-06"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":154,"author":{"gitId":"johnyoozhengxian"},"content":"Format: `mark TASK_ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":156,"author":{"gitId":"johnyoozhengxian"},"content":"* Marks a specified task with id `TASK_ID`.","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":158,"author":{"gitId":"johnyoozhengxian"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":159,"author":{"gitId":"johnyoozhengxian"},"content":"* `mark` followed by a valid integer `TASK_ID` which corresponds to a real task in the database.","lastModifiedDate":"2024-03-06"},{"lineNumber":160,"author":{"gitId":"johnyoozhengxian"},"content":"* `mark 1`","lastModifiedDate":"2024-03-06"},{"lineNumber":161,"author":{"gitId":"johnyoozhengxian"},"content":"* `mark 2`","lastModifiedDate":"2024-03-06"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":163,"author":{"gitId":"johnyoozhengxian"},"content":"### Unmark a task : `unmark`","lastModifiedDate":"2024-03-06"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"johnyoozhengxian"},"content":"Unmarks a task.","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":167,"author":{"gitId":"johnyoozhengxian"},"content":"Format: `unmark TASK_ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"johnyoozhengxian"},"content":"* Unmarks a specified task with id `TASK_ID`.","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"johnyoozhengxian"},"content":"* task to be unmarked should be marked as done before.","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"johnyoozhengxian"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"johnyoozhengxian"},"content":"* `unmark` followed by a valid integer `TASK_ID` which corresponds to a real task in the database.","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"johnyoozhengxian"},"content":"* `unmark 1`","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"johnyoozhengxian"},"content":"* `unmark 2`","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":178,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"gavin331"},"content":"Clears all entries from TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"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":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":201,"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":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":203,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":205,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"gavin331"},"content":"**Add employee** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/Ben Diddle t/friend e/bendiddle@example.com a/Newgate Prison p/21092109 t/criminal`","lastModifiedDate":"2024-03-06"},{"lineNumber":210,"author":{"gitId":"gavin331"},"content":"**List employees** | `listemployees`","lastModifiedDate":"2024-03-06"},{"lineNumber":211,"author":{"gitId":"gavin331"},"content":"**Delete employee** | `delete EMPLOYEE_ID` \u003cbr\u003e e.g., `delete 2`","lastModifiedDate":"2024-03-06"},{"lineNumber":212,"author":{"gitId":"BryanL2303"},"content":"**Add task** | `task TASK_DESCRIPTION` \u003cbr\u003e e.g., `task Weekly meeting`","lastModifiedDate":"2024-03-04"},{"lineNumber":213,"author":{"gitId":"BryanL2303"},"content":"**List tasks** | `listtasks`","lastModifiedDate":"2024-03-04"},{"lineNumber":214,"author":{"gitId":"BryanL2303"},"content":"**Delete task** | `deletetask TASK_ID`\u003cbr\u003e e.g., `deletetask 3`","lastModifiedDate":"2024-03-04"},{"lineNumber":215,"author":{"gitId":"johnyoozhengxian"},"content":"**Mark task** | `mark TASK_ID`\u003cbr\u003e e.g., `mark 1` ","lastModifiedDate":"2024-03-06"},{"lineNumber":216,"author":{"gitId":"johnyoozhengxian"},"content":"**Unmark task** | `unmark TASK_ID`\u003cbr\u003e e.g., `unmark 1` ","lastModifiedDate":"2024-03-06"},{"lineNumber":217,"author":{"gitId":"johnyoozhengxian"},"content":"**Assign task to an employee** | `assigntask t/TASK_ID e/EMPLOYEE_ID` \u003cbr\u003e e.g., `assigntask t/1 e/2`","lastModifiedDate":"2024-03-06"},{"lineNumber":218,"author":{"gitId":"azumieflare"},"content":"**Remove employee from a task** | `removetask t/ TASK_ID e/EMPLOYEE_ID` \u003cbr\u003e e.g., `removetask t/1 e/1`","lastModifiedDate":"2024-03-06"},{"lineNumber":219,"author":{"gitId":"azumieflare"},"content":"**List all tasks and employees assigned to them** | `listassignments`","lastModifiedDate":"2024-03-06"},{"lineNumber":220,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"azumieflare"},"content":"**Save the current state** | `save`","lastModifiedDate":"2024-03-06"},{"lineNumber":222,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"BryanL2303":16,"azumieflare":3,"gavin331":23,"-":150,"johnyoozhengxian":30}},{"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":"BryanL2303"},"content":" content: \"TaskMasterPro\";","lastModifiedDate":"2024-02-28"},{"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":{"BryanL2303":1,"-":294}},{"path":"docs/team/azumieflare.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"azumieflare"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"azumieflare"},"content":"layout: page","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"azumieflare"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"azumieflare"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"azumieflare"},"content":"### Project: TaskMasterPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"azumieflare"},"content":"TaskMasterPro is a desktop application build on AddressBook - Level 3. 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-05"},{"lineNumber":9,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"azumieflare"},"content":"### ToDo, will be updated over time.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"azumieflare"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"azumieflare"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"azumieflare"},"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-05"},{"lineNumber":15,"author":{"gitId":"azumieflare"},"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-05"},{"lineNumber":16,"author":{"gitId":"azumieflare"},"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-05"},{"lineNumber":17,"author":{"gitId":"azumieflare"},"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-05"},{"lineNumber":18,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"azumieflare"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"azumieflare"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"azumieflare"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"azumieflare"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"azumieflare"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"azumieflare"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"azumieflare"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"azumieflare"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"azumieflare"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"azumieflare"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"azumieflare"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"azumieflare"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"azumieflare"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"azumieflare"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"azumieflare"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"azumieflare"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"azumieflare"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"azumieflare"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"azumieflare"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"azumieflare"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"azumieflare"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"azumieflare"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"azumieflare":47}},{"path":"docs/team/bryanlee.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"BryanL2303"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"BryanL2303"},"content":"layout: page","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"BryanL2303"},"content":"title: Bryan Lee\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"BryanL2303"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"BryanL2303"},"content":"### Project: TaskMasterPro","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"BryanL2303"},"content":"### Work in progress... Do not refer to this page yet.","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"BryanL2303"},"content":"TaskMasterPro is a desktop address book application used for organising team members and team projects. 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-04"},{"lineNumber":9,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"BryanL2303"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"BryanL2303"},"content":"* **New Feature**: Description of the feature.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"BryanL2303"},"content":" * What it does:","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"BryanL2303"},"content":" * Justification:","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"BryanL2303"},"content":" * Highlights:","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"BryanL2303"},"content":" * Credits:","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"BryanL2303"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"BryanL2303"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"BryanL2303"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"BryanL2303"},"content":" * Managed releases `v1.1` - `v1.1` (1 release) on GitHub","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"BryanL2303"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"BryanL2303"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"BryanL2303"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"BryanL2303"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"BryanL2303"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"BryanL2303"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"BryanL2303"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"BryanL2303"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"BryanL2303"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"BryanL2303"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"BryanL2303"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"BryanL2303"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"BryanL2303"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"BryanL2303"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"BryanL2303"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"BryanL2303"},"content":" * Integrated a new Github plugin (Codecov) to the team repo","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"BryanL2303":43}},{"path":"docs/team/gavingoh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"gavin331"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"gavin331"},"content":"layout: page","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"gavin331"},"content":"title: Gavin Goh\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"gavin331"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"gavin331"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"gavin331"},"content":"TaskMasterPro 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-05"},{"lineNumber":9,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"gavin331"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"gavin331"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"gavin331"},"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-05"},{"lineNumber":14,"author":{"gitId":"gavin331"},"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-05"},{"lineNumber":15,"author":{"gitId":"gavin331"},"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-05"},{"lineNumber":16,"author":{"gitId":"gavin331"},"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-05"},{"lineNumber":17,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"gavin331"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"gavin331"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"gavin331"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"gavin331"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"gavin331"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"gavin331"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"gavin331"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"gavin331"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"gavin331"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"gavin331"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"gavin331"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"gavin331"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"gavin331"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"gavin331"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"gavin331"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"gavin331"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"gavin331"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"gavin331"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"gavin331"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"gavin331"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"gavin331"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"gavin331"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"gavin331":46}},{"path":"docs/team/johnyoozhengxian.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"johnyoozhengxian"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"johnyoozhengxian"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"johnyoozhengxian"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"johnyoozhengxian"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"johnyoozhengxian"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":9,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"johnyoozhengxian"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"johnyoozhengxian"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":14,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":15,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":16,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":17,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"johnyoozhengxian"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"johnyoozhengxian"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"johnyoozhengxian"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"johnyoozhengxian"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"johnyoozhengxian"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"johnyoozhengxian"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"johnyoozhengxian"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"johnyoozhengxian"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"johnyoozhengxian"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"johnyoozhengxian"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"johnyoozhengxian"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"johnyoozhengxian"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"johnyoozhengxian"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"johnyoozhengxian"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"johnyoozhengxian"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"johnyoozhengxian"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"johnyoozhengxian"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"johnyoozhengxian"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"johnyoozhengxian"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"johnyoozhengxian"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"johnyoozhengxian"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"johnyoozhengxian"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"johnyoozhengxian":46}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"azumieflare"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T15-4/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T15-4/tp/actions)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"azumieflare"},"content":"# TaskMasterPro","lastModifiedDate":"2024-03-05"},{"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":"azumieflare"},"content":"TaskMasterPro is a desktop application designed to aid managers with managing employee\u0027s tasks.","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"azumieflare"},"content":"### Features","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"azumieflare"},"content":"* Add or remove","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"azumieflare"},"content":" * Employees","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"azumieflare"},"content":" * Tasks","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"azumieflare"},"content":"* Assign tasks to employees","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"azumieflare"},"content":"* List all information","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"azumieflare"},"content":"* Mark tasks as completed or not completed","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"azumieflare"},"content":"* Save and Load","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"azumieflare"},"content":"\u003c!-- Add more if needed --\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"azumieflare"},"content":"# Contents","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"azumieflare"},"content":"- [Feature breakdown](#feature-breakdown)","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"azumieflare"},"content":"- [How to use](#how-to-use)","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"azumieflare"},"content":"- [Credits](#credits)","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"azumieflare"},"content":"# Feature Breakdown","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"azumieflare"},"content":"```add``` - Adds an employee to TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"azumieflare"},"content":"```add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAGS]```","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"azumieflare"},"content":"```delete``` - Deletes an employee from TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"azumieflare"},"content":"```delete EMPLOYEE_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"azumieflare"},"content":"```listemployees``` - Lists all employee recorded in TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"azumieflare"},"content":"```task``` - Creates a task and add it to TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"azumieflare"},"content":"```task TASK_DESCRIPTION```","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"azumieflare"},"content":"```deletetask``` - Deletes a task from TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"azumieflare"},"content":"```deletetask TASK_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"azumieflare"},"content":"```listtasks``` - Lists all tasks recorded in TaskMasterPro \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"azumieflare"},"content":"```assigntask``` - Assigns a task to an employee \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"azumieflare"},"content":"```assigntask t/TASK_ID e/EMPLOYEE_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"azumieflare"},"content":"```removetask``` - Removes a task from an employee \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"azumieflare"},"content":"```removetask t/ TASK_ID e/EMPLOYEE_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"azumieflare"},"content":"```listassignments``` - Lists all tasks and employees assigned to them \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"azumieflare"},"content":"```mark``` - Marks a task as completed \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"azumieflare"},"content":"```mark TASK_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"azumieflare"},"content":"```unmark``` - Marks a task as not completed \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"azumieflare"},"content":"```unmark TASK_ID```","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"azumieflare"},"content":"```save``` - Saves the current state of TaskMasterPro into a save file \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"azumieflare"},"content":"\u003c!-- load? --\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"azumieflare"},"content":"# How to use","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"azumieflare"},"content":"Down the .jar file from releases \u003c!-- TODO --\u003e and run the command \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"azumieflare"},"content":"```java -jar TaskMasterPro.jar```","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":63,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":64,"author":{"gitId":"azumieflare"},"content":"# Credits","lastModifiedDate":"2024-03-05"},{"lineNumber":65,"author":{"gitId":"azumieflare"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"azumieflare":62,"-":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":"-"},"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":"gavin331"},"content":"### Gavin Goh","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"gavin331"},"content":"\u003cimg src\u003d\"images/gavin331.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"gavin331"},"content":"[[github](http://github.com/gavin331)]","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"gavin331"},"content":"[[portfolio](team/gavingoh.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"gavin331"},"content":"* Role: Team Member","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"gavin331"},"content":"* Responsibilities: Deliver the project tasks on time and ensure the quality of the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"azumieflare"},"content":"### John Chan","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"azumieflare"},"content":"\u003cimg src\u003d\"images/azumieflare.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"azumieflare"},"content":"[[github](http://github.com/azumieflare)] [[portfolio](team/azumieflare.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"azumieflare"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"azumieflare"},"content":"* Responsibilities: Ensuring project deliverables are done on time and in the right format.","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"BryanL2303"},"content":"### Bryan Lee","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"BryanL2303"},"content":"\u003cimg src\u003d\"images/bryanl2303.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"BryanL2303"},"content":"[[github](http://github.com/BryanL2303)]","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"BryanL2303"},"content":"[[portfolio](team/bryanlee.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"BryanL2303"},"content":"* Role: Scheduling and tracking","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"BryanL2303"},"content":"* Responsibilities: In charge of defining, assigning, and tracking project tasks","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"johnyoozhengxian"},"content":"### John Yoo","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"johnyoozhengxian"},"content":"\u003cimg src\u003d\"images/johnyoozhengxian.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"johnyoozhengxian"},"content":"[[github](http://github.com/johnyoozhengxian)]","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"johnyoozhengxian"},"content":"[[portfolio](team/johnyoozhengxian.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"BryanL2303":6,"azumieflare":5,"gavin331":6,"-":28,"johnyoozhengxian":4}},{"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":"BryanL2303"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-05"},{"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":"azumieflare"},"content":"**Target user profile**: Managers who","lastModifiedDate":"2024-03-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"azumieflare"},"content":"* manage many employees","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"azumieflare"},"content":"* prefers command line input ","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"azumieflare"},"content":"* comfortable with manually editing save file ","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"azumieflare"},"content":"**Value proposition**: manage employees faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-07"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"BryanL2303"},"content":"|----------| ------------------------------------------ |----------------------------------------------|-------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | add a new person | keep a person on record |","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | list all recorded persons | locate details of all persons in a list |","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | add a new task | keep upcoming tasks on record |","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | delete a task | remove entries that I no longer need |","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | list all recorded tasks | locate details of all tasks in a list |","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | assign a person to a tasks | keep track of who is supposed to contribute to a task |","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | unassign a person from a task | update changes in manpower allocation |","lastModifiedDate":"2024-03-05"},{"lineNumber":287,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | list all tasks with their assigned employees | locate details of all tasks while seeing who are assigned to them |","lastModifiedDate":"2024-03-05"},{"lineNumber":288,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | mark a task as done | keep track of task completion |","lastModifiedDate":"2024-03-05"},{"lineNumber":289,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | unmark a marked task | undo wrongly marked tasks |","lastModifiedDate":"2024-03-05"},{"lineNumber":290,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | save current data | keep track of all data even after exiting |","lastModifiedDate":"2024-03-05"},{"lineNumber":291,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | load saved data | use the data that was saved previously |","lastModifiedDate":"2024-03-05"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"BryanL2303"},"content":"*{More to be added for v1.3}*","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"BryanL2303"},"content":"(For all use cases below, the **System** is the `TaskMasterPro` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"BryanL2303"},"content":"2. TaskMasterPro shows a list of persons with their ids","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"BryanL2303"},"content":"3. User requests to delete a specific person in the list by their id","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"BryanL2303"},"content":"4. TaskMasterPro deletes the person","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"BryanL2303"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"BryanL2303"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":317,"author":{"gitId":"BryanL2303"},"content":"* 3a. The given id is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"BryanL2303"},"content":" * 3a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"BryanL2303"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"BryanL2303"},"content":"**Use case: Delete a task**","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"BryanL2303"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"BryanL2303"},"content":"1. User requests to list tasks","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"BryanL2303"},"content":"2. TaskMasterPro shows a list of tasks with their ids","lastModifiedDate":"2024-03-05"},{"lineNumber":329,"author":{"gitId":"BryanL2303"},"content":"3. User requests to delete a specific task in the list by their id","lastModifiedDate":"2024-03-05"},{"lineNumber":330,"author":{"gitId":"BryanL2303"},"content":"4. TaskMasterPro deletes the task","lastModifiedDate":"2024-03-05"},{"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":"-"},"content":"* 2a. The list is empty.","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":"BryanL2303"},"content":"* 3a. The given id is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"BryanL2303"},"content":" * 3a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"BryanL2303"},"content":"**Use case: Assign/unassign a person to a task**","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"BryanL2303"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"BryanL2303"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"BryanL2303"},"content":"2. TaskMasterPro shows a list of persons with their ids ","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"BryanL2303"},"content":"3. User requests to list tasks ","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"BryanL2303"},"content":"4. TaskMasterPro shows a list of tasks with their ids ","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"BryanL2303"},"content":"5. User requests to assign/un-assign a specific person in the person list by their id to a specific task in the task list by its id","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"BryanL2303"},"content":"6. TaskMasterPro assigns/un-assigns the person to the task","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"BryanL2303"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"BryanL2303"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"BryanL2303"},"content":"* 4a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":367,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"BryanL2303"},"content":"* 5a. Any given id is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"BryanL2303"},"content":" * 5a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"BryanL2303"},"content":" Use case resumes at step 2/4.","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"gavin331"},"content":"**Use case: Mark/unmark a task as done/not done**","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"gavin331"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"gavin331"},"content":"1. User requests to list tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"gavin331"},"content":"2. TaskMasterPro shows a list of tasks with their ids","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"gavin331"},"content":"3. User requests to mark/unmark a specific task in the list by their id as done/not done","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"gavin331"},"content":"4. TaskMasterPro marks/unmarks that task as done/not done.","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"gavin331"},"content":"* 3a. The given id is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"gavin331"},"content":" * 3a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"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":403,"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":404,"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":405,"author":{"gitId":"gavin331"},"content":"4. Should be able to handle a corrupted data file without crashing.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":412,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"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":{"BryanL2303":73,"azumieflare":5,"gavin331":11,"-":376}},{"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":"johnyoozhengxian"},"content":"TaskMasterPro is a **desktop app for managing team members and group tasks**, 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, TaskMasterPro 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":"BryanL2303"},"content":"## This section to be done after v1.2 is released","lastModifiedDate":"2024-03-04"},{"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":"-"},"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":" * `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":"gavin331"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-03-06"},{"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":"gavin331"},"content":"### Adding an employee: `add`","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"gavin331"},"content":"Adds an employee to TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"gavin331"},"content":"Make sure that your parameter\u0027s formats are valid!","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"gavin331"},"content":"* `add n/AikenDueet p/12311231 e/aiken@example.com a/Dueet street, block 123, #01-01`","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"gavin331"},"content":"* `add n/Ben Diddle t/friend e/bendiddle@example.com a/Newgate Prison p/21092109 t/criminal`","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"gavin331"},"content":"### Listing all employees: `list`","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":90,"author":{"gitId":"gavin331"},"content":"Shows a list of all employees in TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"gavin331"},"content":"Format: `listemployees`","lastModifiedDate":"2024-03-06"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"gavin331"},"content":"### Deleting an employee: `delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":96,"author":{"gitId":"gavin331"},"content":"Deletes the specified employee from TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":98,"author":{"gitId":"gavin331"},"content":"Format: `delete EMPLOYEE_ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":100,"author":{"gitId":"gavin331"},"content":"* The `EMPLOYEE_ID` refers to the index number shown in the displayed employee list.","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"gavin331"},"content":" Make sure that its valid!","lastModifiedDate":"2024-03-06"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":104,"author":{"gitId":"gavin331"},"content":"* `listemployees` followed by `delete 3` deletes the employee with id 3 in TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"BryanL2303"},"content":"### Adding a task: `task`","lastModifiedDate":"2024-03-04"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"gavin331"},"content":"Adds a task to TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"BryanL2303"},"content":"Format: `task TASK_DESCRIPTION`","lastModifiedDate":"2024-03-04"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"BryanL2303"},"content":"The description for the task is required and can be any length with spaces in between","lastModifiedDate":"2024-03-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"BryanL2303"},"content":"* `task Weekly meeting`","lastModifiedDate":"2024-03-04"},{"lineNumber":118,"author":{"gitId":"BryanL2303"},"content":"* `task Submitting report`","lastModifiedDate":"2024-03-04"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"BryanL2303"},"content":"### Listing all tasks : `listtasks`","lastModifiedDate":"2024-03-04"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"gavin331"},"content":"Shows a list of all tasks in TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"BryanL2303"},"content":"Format: `listtasks`","lastModifiedDate":"2024-03-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"BryanL2303"},"content":"### Deleting a task : `deletetask TASK_ID`","lastModifiedDate":"2024-03-04"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"gavin331"},"content":"Deletes the specified task from TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"BryanL2303"},"content":"Format: `deletetask TASK_ID`","lastModifiedDate":"2024-03-04"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"BryanL2303"},"content":"* Deletes the task with the specified `TASK_ID`.","lastModifiedDate":"2024-03-04"},{"lineNumber":133,"author":{"gitId":"BryanL2303"},"content":"* The task id refers to the number shown in the displayed task list.","lastModifiedDate":"2024-03-04"},{"lineNumber":134,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"gavin331"},"content":"* `listtasks` followed by `deletetask 2` deletes the task with id 2 in TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"johnyoozhengxian"},"content":"### Assign a task to employee : `assigntask`","lastModifiedDate":"2024-03-06"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":141,"author":{"gitId":"johnyoozhengxian"},"content":"Assigns a task object to employee.","lastModifiedDate":"2024-03-06"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":143,"author":{"gitId":"johnyoozhengxian"},"content":"Format: `assigntask t/TASK_ID e/EMPLOYEE_ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":145,"author":{"gitId":"johnyoozhengxian"},"content":"* Assigns a task object with id `TASK_ID` to an employee with id `EMPLOYEE_ID`.","lastModifiedDate":"2024-03-06"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":147,"author":{"gitId":"johnyoozhengxian"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":148,"author":{"gitId":"johnyoozhengxian"},"content":"* `assigntask` followed by `2 3` assigns task object with id 2 to an employee with id 3.","lastModifiedDate":"2024-03-06"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":150,"author":{"gitId":"johnyoozhengxian"},"content":"### Mark a task : `mark`","lastModifiedDate":"2024-03-06"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":152,"author":{"gitId":"johnyoozhengxian"},"content":"Marks a task as done.","lastModifiedDate":"2024-03-06"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":154,"author":{"gitId":"johnyoozhengxian"},"content":"Format: `mark TASK_ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":156,"author":{"gitId":"johnyoozhengxian"},"content":"* Marks a specified task with id `TASK_ID`.","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":158,"author":{"gitId":"johnyoozhengxian"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":159,"author":{"gitId":"johnyoozhengxian"},"content":"* `mark` followed by a valid integer `TASK_ID` which corresponds to a real task in the database.","lastModifiedDate":"2024-03-06"},{"lineNumber":160,"author":{"gitId":"johnyoozhengxian"},"content":"* `mark 1`","lastModifiedDate":"2024-03-06"},{"lineNumber":161,"author":{"gitId":"johnyoozhengxian"},"content":"* `mark 2`","lastModifiedDate":"2024-03-06"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":163,"author":{"gitId":"johnyoozhengxian"},"content":"### Unmark a task : `unmark`","lastModifiedDate":"2024-03-06"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"johnyoozhengxian"},"content":"Unmarks a task.","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":167,"author":{"gitId":"johnyoozhengxian"},"content":"Format: `unmark TASK_ID`","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"johnyoozhengxian"},"content":"* Unmarks a specified task with id `TASK_ID`.","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"johnyoozhengxian"},"content":"* task to be unmarked should be marked as done before.","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"johnyoozhengxian"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"johnyoozhengxian"},"content":"* `unmark` followed by a valid integer `TASK_ID` which corresponds to a real task in the database.","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"johnyoozhengxian"},"content":"* `unmark 1`","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"johnyoozhengxian"},"content":"* `unmark 2`","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":178,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"gavin331"},"content":"Clears all entries from TaskMasterPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"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":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":201,"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":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":203,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":205,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"gavin331"},"content":"**Add employee** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/Ben Diddle t/friend e/bendiddle@example.com a/Newgate Prison p/21092109 t/criminal`","lastModifiedDate":"2024-03-06"},{"lineNumber":210,"author":{"gitId":"gavin331"},"content":"**List employees** | `listemployees`","lastModifiedDate":"2024-03-06"},{"lineNumber":211,"author":{"gitId":"gavin331"},"content":"**Delete employee** | `delete EMPLOYEE_ID` \u003cbr\u003e e.g., `delete 2`","lastModifiedDate":"2024-03-06"},{"lineNumber":212,"author":{"gitId":"BryanL2303"},"content":"**Add task** | `task TASK_DESCRIPTION` \u003cbr\u003e e.g., `task Weekly meeting`","lastModifiedDate":"2024-03-04"},{"lineNumber":213,"author":{"gitId":"BryanL2303"},"content":"**List tasks** | `listtasks`","lastModifiedDate":"2024-03-04"},{"lineNumber":214,"author":{"gitId":"BryanL2303"},"content":"**Delete task** | `deletetask TASK_ID`\u003cbr\u003e e.g., `deletetask 3`","lastModifiedDate":"2024-03-04"},{"lineNumber":215,"author":{"gitId":"johnyoozhengxian"},"content":"**Mark task** | `mark TASK_ID`\u003cbr\u003e e.g., `mark 1` ","lastModifiedDate":"2024-03-06"},{"lineNumber":216,"author":{"gitId":"johnyoozhengxian"},"content":"**Unmark task** | `unmark TASK_ID`\u003cbr\u003e e.g., `unmark 1` ","lastModifiedDate":"2024-03-06"},{"lineNumber":217,"author":{"gitId":"johnyoozhengxian"},"content":"**Assign task to an employee** | `assigntask t/TASK_ID e/EMPLOYEE_ID` \u003cbr\u003e e.g., `assigntask t/1 e/2`","lastModifiedDate":"2024-03-06"},{"lineNumber":218,"author":{"gitId":"azumieflare"},"content":"**Remove employee from a task** | `removetask t/ TASK_ID e/EMPLOYEE_ID` \u003cbr\u003e e.g., `removetask t/1 e/1`","lastModifiedDate":"2024-03-06"},{"lineNumber":219,"author":{"gitId":"azumieflare"},"content":"**List all tasks and employees assigned to them** | `listassignments`","lastModifiedDate":"2024-03-06"},{"lineNumber":220,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"azumieflare"},"content":"**Save the current state** | `save`","lastModifiedDate":"2024-03-06"},{"lineNumber":222,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"BryanL2303":15,"azumieflare":3,"gavin331":23,"-":150,"johnyoozhengxian":31}},{"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":"BryanL2303"},"content":" content: \"TaskMasterPro\";","lastModifiedDate":"2024-02-28"},{"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":{"BryanL2303":1,"-":294}},{"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":"BryanL2303"},"content":"title: TaskMasterPro","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"BryanL2303"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T15-4/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T15-4/tp/actions)","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"BryanL2303"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T15-4/tp/branch/master/graph/badge.svg)](https://codecov.io/gh/AY2324S2-CS2103T-T15-4/tp)","lastModifiedDate":"2024-03-08"},{"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":"BryanL2303"},"content":"**TaskMasterPro is a desktop application designed to aid managers with managing employee\u0027s tasks.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"BryanL2303"},"content":"* If you are interested in using TaskMasterPro, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"BryanL2303"},"content":"* If you are interested about developing TaskMasterPro, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-08"},{"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":"BryanL2303"},"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":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":{"BryanL2303":7,"-":13}},{"path":"docs/team/azumieflare.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"azumieflare"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"azumieflare"},"content":"layout: page","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"azumieflare"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"azumieflare"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"azumieflare"},"content":"### Project: TaskMasterPro","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"azumieflare"},"content":"TaskMasterPro is a desktop application build on AddressBook - Level 3. 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-05"},{"lineNumber":9,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"azumieflare"},"content":"### ToDo, will be updated over time.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"azumieflare"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"azumieflare"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"azumieflare"},"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-05"},{"lineNumber":15,"author":{"gitId":"azumieflare"},"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-05"},{"lineNumber":16,"author":{"gitId":"azumieflare"},"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-05"},{"lineNumber":17,"author":{"gitId":"azumieflare"},"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-05"},{"lineNumber":18,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"azumieflare"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"azumieflare"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"azumieflare"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"azumieflare"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"azumieflare"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"azumieflare"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"azumieflare"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"azumieflare"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"azumieflare"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"azumieflare"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"azumieflare"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"azumieflare"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"azumieflare"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"azumieflare"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"azumieflare"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"azumieflare"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"azumieflare"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"azumieflare"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"azumieflare"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"azumieflare"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"azumieflare"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"azumieflare"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"azumieflare"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"azumieflare":47}},{"path":"docs/team/bryanlee.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"BryanL2303"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"BryanL2303"},"content":"layout: page","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"BryanL2303"},"content":"title: Bryan Lee\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"BryanL2303"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"BryanL2303"},"content":"### Project: TaskMasterPro","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"BryanL2303"},"content":"### Work in progress... Do not refer to this page yet.","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"BryanL2303"},"content":"TaskMasterPro is a desktop address book application used for organising team members and team projects. 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-04"},{"lineNumber":9,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"BryanL2303"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"BryanL2303"},"content":"* **New Feature**: Description of the feature.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"BryanL2303"},"content":" * What it does:","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"BryanL2303"},"content":" * Justification:","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"BryanL2303"},"content":" * Highlights:","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"BryanL2303"},"content":" * Credits:","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"BryanL2303"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"BryanL2303"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"BryanL2303"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"BryanL2303"},"content":" * Managed releases `v1.1` - `v1.1` (1 release) on GitHub","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"BryanL2303"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"BryanL2303"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"BryanL2303"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"BryanL2303"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"BryanL2303"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"BryanL2303"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"BryanL2303"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"BryanL2303"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"BryanL2303"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"BryanL2303"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"BryanL2303"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"BryanL2303"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"BryanL2303"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"BryanL2303"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"BryanL2303"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"BryanL2303"},"content":" * Integrated a new Github plugin (Codecov) to the team repo","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"BryanL2303":43}},{"path":"docs/team/gavingoh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"gavin331"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"gavin331"},"content":"layout: page","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"gavin331"},"content":"title: Gavin Goh\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"gavin331"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"gavin331"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"gavin331"},"content":"TaskMasterPro 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-05"},{"lineNumber":9,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"gavin331"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"gavin331"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"gavin331"},"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-05"},{"lineNumber":14,"author":{"gitId":"gavin331"},"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-05"},{"lineNumber":15,"author":{"gitId":"gavin331"},"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-05"},{"lineNumber":16,"author":{"gitId":"gavin331"},"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-05"},{"lineNumber":17,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"gavin331"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"gavin331"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"gavin331"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"gavin331"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"gavin331"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"gavin331"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"gavin331"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"gavin331"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"gavin331"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"gavin331"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"gavin331"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"gavin331"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"gavin331"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"gavin331"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"gavin331"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"gavin331"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"gavin331"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"gavin331"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"gavin331"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"gavin331"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"gavin331"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"gavin331"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"gavin331":46}},{"path":"docs/team/johnyoozhengxian.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"johnyoozhengxian"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"johnyoozhengxian"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"johnyoozhengxian"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"johnyoozhengxian"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"johnyoozhengxian"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":9,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"johnyoozhengxian"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"johnyoozhengxian"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":14,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":15,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":16,"author":{"gitId":"johnyoozhengxian"},"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-06"},{"lineNumber":17,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"johnyoozhengxian"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"johnyoozhengxian"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"johnyoozhengxian"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"johnyoozhengxian"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"johnyoozhengxian"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"johnyoozhengxian"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"johnyoozhengxian"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"johnyoozhengxian"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"johnyoozhengxian"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"johnyoozhengxian"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"johnyoozhengxian"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"johnyoozhengxian"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"johnyoozhengxian"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"johnyoozhengxian"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"johnyoozhengxian"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"johnyoozhengxian"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"johnyoozhengxian"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"johnyoozhengxian"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"johnyoozhengxian"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"johnyoozhengxian"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"johnyoozhengxian"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"johnyoozhengxian"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"johnyoozhengxian"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"johnyoozhengxian":46}}] diff --git a/AY2324S2-CS2103T-T15-4_tp_master/commits.json b/AY2324S2-CS2103T-T15-4_tp_master/commits.json index 2bb5251e..847a2fc0 100644 --- a/AY2324S2-CS2103T-T15-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-T15-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"BryanL2303":[{"date":"2024-03-04","commitResults":[{"hash":"20c336ac4bacc6f4724d2005eda13f413f80f0ca","isMergeCommit":false,"messageTitle":"Add Bryan portfolio and image","messageBody":"Added my image png file.\nUpdated my own profile in AboutUs.md and included a portfolio page under teams folder bryanlee.md.\n","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":16}}},{"hash":"b1bedd86195b412852747fd4e1951a430c13a2ac","isMergeCommit":false,"messageTitle":"Stylecheck correction","messageBody":"Got rid of trailing whitespaces and include a blankline eof.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"0d0f746cf177265d021a8bfa690b75db80594ab7","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Only left the following features from the initial features:\n1. clear\n2. help\n3. exit\n\nAdded descriptions for the commands to add/list/delete tasks\nAdded them to the command summary as well.\n","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":75}}}]},{"date":"2024-03-05","commitResults":[{"hash":"a4856c24899ded53d9f0f8721cecad47bd13a80f","isMergeCommit":true,"messageTitle":"Merge pull request #14 from azumieflare/branch-README","messageBody":"Looks good, thanks.","fileTypesAndContributionMap":{}},{"hash":"0a88ce0596f2b76fddf71ccfb5d2ed1a15d03508","isMergeCommit":true,"messageTitle":"Merge pull request #13 from azumieflare/branch-AboutUs","messageBody":"Add profile for John Chan","fileTypesAndContributionMap":{}},{"hash":"ded6d09c0d45d0bd3f7584ca825a9f9875e92e3a","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Added all user stories for v1.2\nAdded use cases relevant for v1.2\n\nAll other segments still requires updates, they are merely templates\ngiven to us.\n","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":17}}},{"hash":"b33e892b59f9207e20fdd5e815069e728bbd190f","isMergeCommit":false,"messageTitle":"Update image name","messageBody":"Changed name of image file to github handle for tracking purposes\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"4f1fcf52d032d0f51b98977d996c8c7916562bb2","isMergeCommit":true,"messageTitle":"Merge pull request #18 from gavin331/1-update-aboutus-page","messageBody":"Update AboutUs.md with Gavin\u0027s profile","fileTypesAndContributionMap":{}},{"hash":"3d5120b3c6a7ff7ed0991fe6eafc30fb65545592","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 5-update-readme-page","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"836eaacce85329b54581198c48ac3b3756fe95e1","isMergeCommit":true,"messageTitle":"Merge pull request #21 from gavin331/gavin331-8-update-dg","messageBody":"Add use case for marking and unmarking a task","fileTypesAndContributionMap":{}},{"hash":"60c908163841eebd99c9115ae894ab9839884041","isMergeCommit":true,"messageTitle":"Merge pull request #19 from gavin331/gavin-7-update-user-guide","messageBody":"Add employee functions to UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"4558e908fe2e005012b4ad7c78098d34e3a436a0","isMergeCommit":true,"messageTitle":"Merge pull request #27 from johnyoozhengxian/update-aboutus-page","messageBody":"Add AboutUs","fileTypesAndContributionMap":{}},{"hash":"0ae7eabf7cb8466c559c308a917f20436d502c11","isMergeCommit":false,"messageTitle":"Fix checkstyle error","messageBody":"Trailing whitespace caused CI failure.","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e9fc98552a6a22b3b33f726be1b34f52912de7ab","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 1-update-aboutus-page","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b71585c3183a10f94fd44bdfa3b852eae0b6a976","isMergeCommit":true,"messageTitle":"Merge pull request #29 from AY2324S2-CS2103T-T15-4/7-update-user-guide","messageBody":"Close for v1.1","fileTypesAndContributionMap":{}}]}],"azumieflare":[{"date":"2024-03-05","commitResults":[{"hash":"d647c7f4f40d9b9743aa9e42a29b6675915d1133","isMergeCommit":false,"messageTitle":"Edit about us","messageBody":"Updated self profile.\n","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":5}}},{"hash":"04b8660becaab6301fdb925dd243b65242036404","isMergeCommit":false,"messageTitle":"Edit README.md","messageBody":"Updated details of the app.\n","fileTypesAndContributionMap":{"docs":{"insertions":62,"deletions":11}}},{"hash":"bbe0a84623d81418e7997852c75729d2d09972e4","isMergeCommit":false,"messageTitle":"Undo changes","messageBody":"Removed updates done to AboutUs to isolate all\nchanges to README to this branch.\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":53}}},{"hash":"76935bcd649ba859b6933608cf19a72e65b72a78","isMergeCommit":false,"messageTitle":"Undo changes","messageBody":"Removed updates done.\n","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":62}}},{"hash":"63ba72b8e9df486f13ad08ea73e825ad568357aa","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Updated details of the app.\n","fileTypesAndContributionMap":{"docs":{"insertions":62,"deletions":11}}},{"hash":"6985d7a051cf367ff433d7fa41f19fac3c089554","isMergeCommit":false,"messageTitle":"Edit AboutUs.md","messageBody":"Updated self profile.\n","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":6}}},{"hash":"b52a462171b993fd0a5107f466840a84e13d60c0","isMergeCommit":false,"messageTitle":"Edit AboutUs.md","messageBody":"Fixed EOF error.\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"85c5c7eb7b0a9b6afc05525f4241631ae91166c1","isMergeCommit":false,"messageTitle":"Edit AboutUs.md","messageBody":"Fixed EOF error.\n","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"25d998b936655a4de4200fb2f087ea18b190e72e","isMergeCommit":true,"messageTitle":"Merge pull request #31 from AY2324S2-CS2103T-T15-4/1-update-aboutus-page","messageBody":"Merge AboutUs page for v1.1","fileTypesAndContributionMap":{}},{"hash":"50261fb4cc2955dc29aac52a5b8679ba86489772","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 8-update-dg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"aa0f4c1ec993bc5d571545977ac03f57a6b9831b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 7-update-user-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5ffd3a754edbce36809a124db2e2aa4d8e2e151a","isMergeCommit":true,"messageTitle":"Merge pull request #30 from AY2324S2-CS2103T-T15-4/8-update-dg","messageBody":"Close DG for v1.1","fileTypesAndContributionMap":{}},{"hash":"89794d44100e63504679a19084e9e2311175cff7","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 7-update-user-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"343879f3cac8aa237a006d332a30af01aac2c2df","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Added missing commands","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"2cb1f9bf8886ee03f3b93df351bc71184b14a9ba","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"Updated product scope.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":7}}},{"hash":"3b4c02aca92d5f89e00d116ea55bd762b636028b","isMergeCommit":true,"messageTitle":"Merge pull request #34 from azumieflare/branch-DG","messageBody":"Branch dg","fileTypesAndContributionMap":{}}]}],"gavin331":[{"date":"2024-03-05","commitResults":[{"hash":"84d0974fd880fe1cc7606f217a72ae3dac757b62","isMergeCommit":true,"messageTitle":"Merge pull request #10 from BryanL2303/1-update-aboutus-page","messageBody":"Add profile for Bryan","fileTypesAndContributionMap":{}},{"hash":"c6190f8875b9b6e9135b75b7e936f173ae8ac7af","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":16}}},{"hash":"4f047714a2758b58b760a2243234d7216be1ac4b","isMergeCommit":true,"messageTitle":"Merge branch \u00271-update-aboutus-page\u0027 into 1-update-aboutus-page","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f438e87d9594b131c98f1b4d6eea6359112a36a0","isMergeCommit":true,"messageTitle":"Merge pull request #11 from BryanL2303/7-update-user-guide","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"e41f536708b723b838e647f9b39ddbb858421534","isMergeCommit":false,"messageTitle":"Add employee functions to UserGuide.md","messageBody":"Add \u0027adding employee\u0027, \u0027listing employees\u0027, \u0027deleting employee\u0027\nto the userguide. Also, I renamed parts of the code where we used\n\u0027address book\u0027 to \u0027TaskMasterPro\u0027.\n","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":12}}},{"hash":"bc95f46bc916b883fd0ba3f968419482a0114e67","isMergeCommit":true,"messageTitle":"Merge pull request #15 from AY2324S2-CS2103T-T15-4/5-update-readme-page","messageBody":"Update README","fileTypesAndContributionMap":{}},{"hash":"9019491d8737a75914331b26bae6aab9ad5de208","isMergeCommit":true,"messageTitle":"Merge pull request #16 from BryanL2303/8-update-dg","messageBody":"Update user stories and cases","fileTypesAndContributionMap":{}},{"hash":"9dd830944d442e2bcd68a3fc171021abdebaf8e3","isMergeCommit":false,"messageTitle":"Add use case for marking and unmarking a task","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"cf7a1e1288e064190019d60533018509c4dba410","isMergeCommit":true,"messageTitle":"Merge pull request #36 from AY2324S2-CS2103T-T15-4/8-update-dg","messageBody":"8 update dg","fileTypesAndContributionMap":{}},{"hash":"4dff5e5498c0cada0c69f951ce8550172726078e","isMergeCommit":false,"messageTitle":"Update NFR in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"ed2313bb1c10989b98ae25fab4cfa551e0713616","isMergeCommit":true,"messageTitle":"Merge pull request #37 from gavin331/35-add-nfr-to-dg","messageBody":"Update NFR in DG","fileTypesAndContributionMap":{}},{"hash":"d7e0dddca61cc70cc634ccae9cf0dd25a11eceda","isMergeCommit":true,"messageTitle":"Merge pull request #38 from AY2324S2-CS2103T-T15-4/35-add-nfr-to-dg","messageBody":"35 add nfr to dg","fileTypesAndContributionMap":{}}]}],"johnyoozhengxian":[{"date":"2024-03-06","commitResults":[{"hash":"f0055421a56a53954ec4cf42f72fb17046e06401","isMergeCommit":false,"messageTitle":"Add AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":0}}},{"hash":"2822ac4fff874b07776eca15eacbd33bff00eeba","isMergeCommit":false,"messageTitle":"Add UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":39,"deletions":0}}},{"hash":"f79813bb662d879ef9fb37c0bb5c0e4cfd4fe2bd","isMergeCommit":true,"messageTitle":"Merge branch \u00271-update-aboutus-page\u0027 into update-aboutus-page","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"e0457053ee64c493975e77818c54c20c87be9979","isMergeCommit":true,"messageTitle":"Merge pull request #28 from johnyoozhengxian/update-ug","messageBody":"Add UG","fileTypesAndContributionMap":{}},{"hash":"c0e02c3ffa515310761697163248f75498898d3b","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b1a19f35800f84c1fa7851eebeda25908269aff4","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}},{"hash":"28f75d466ae14ec5bc45b923c9ac20b2ec53477e","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}}]}]},"authorFileTypeContributionMap":{"BryanL2303":{"docs":138,"functional-code":0,"test-code":0,"other":1},"azumieflare":{"docs":122,"functional-code":0,"test-code":0},"gavin331":{"docs":86,"functional-code":0,"test-code":0},"johnyoozhengxian":{"docs":80,"functional-code":0,"test-code":0}},"authorContributionVariance":{"BryanL2303":2367.4539,"azumieflare":10444.49,"gavin331":684.20404,"johnyoozhengxian":731.25},"authorDisplayNameMap":{"BryanL2303":"CS2103T-T15-4 BRYA.. YIN","azumieflare":"CS2103T-T15-4 CHAN..JOHN","gavin331":"CS2103T-T15-4 GAVI.. WEI","johnyoozhengxian":"CS2103T-T15-4 JOHN..XIAN"}} +{"authorDailyContributionsMap":{"BryanL2303":[{"date":"2024-03-04","commitResults":[{"hash":"20c336ac4bacc6f4724d2005eda13f413f80f0ca","isMergeCommit":false,"messageTitle":"Add Bryan portfolio and image","messageBody":"Added my image png file.\nUpdated my own profile in AboutUs.md and included a portfolio page under teams folder bryanlee.md.\n","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":16}}},{"hash":"b1bedd86195b412852747fd4e1951a430c13a2ac","isMergeCommit":false,"messageTitle":"Stylecheck correction","messageBody":"Got rid of trailing whitespaces and include a blankline eof.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"0d0f746cf177265d021a8bfa690b75db80594ab7","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Only left the following features from the initial features:\n1. clear\n2. help\n3. exit\n\nAdded descriptions for the commands to add/list/delete tasks\nAdded them to the command summary as well.\n","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":75}}}]},{"date":"2024-03-05","commitResults":[{"hash":"a4856c24899ded53d9f0f8721cecad47bd13a80f","isMergeCommit":true,"messageTitle":"Merge pull request #14 from azumieflare/branch-README","messageBody":"Looks good, thanks.","fileTypesAndContributionMap":{}},{"hash":"0a88ce0596f2b76fddf71ccfb5d2ed1a15d03508","isMergeCommit":true,"messageTitle":"Merge pull request #13 from azumieflare/branch-AboutUs","messageBody":"Add profile for John Chan","fileTypesAndContributionMap":{}},{"hash":"ded6d09c0d45d0bd3f7584ca825a9f9875e92e3a","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Added all user stories for v1.2\nAdded use cases relevant for v1.2\n\nAll other segments still requires updates, they are merely templates\ngiven to us.\n","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":17}}},{"hash":"b33e892b59f9207e20fdd5e815069e728bbd190f","isMergeCommit":false,"messageTitle":"Update image name","messageBody":"Changed name of image file to github handle for tracking purposes\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"4f1fcf52d032d0f51b98977d996c8c7916562bb2","isMergeCommit":true,"messageTitle":"Merge pull request #18 from gavin331/1-update-aboutus-page","messageBody":"Update AboutUs.md with Gavin\u0027s profile","fileTypesAndContributionMap":{}},{"hash":"3d5120b3c6a7ff7ed0991fe6eafc30fb65545592","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 5-update-readme-page","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"836eaacce85329b54581198c48ac3b3756fe95e1","isMergeCommit":true,"messageTitle":"Merge pull request #21 from gavin331/gavin331-8-update-dg","messageBody":"Add use case for marking and unmarking a task","fileTypesAndContributionMap":{}},{"hash":"60c908163841eebd99c9115ae894ab9839884041","isMergeCommit":true,"messageTitle":"Merge pull request #19 from gavin331/gavin-7-update-user-guide","messageBody":"Add employee functions to UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"4558e908fe2e005012b4ad7c78098d34e3a436a0","isMergeCommit":true,"messageTitle":"Merge pull request #27 from johnyoozhengxian/update-aboutus-page","messageBody":"Add AboutUs","fileTypesAndContributionMap":{}},{"hash":"0ae7eabf7cb8466c559c308a917f20436d502c11","isMergeCommit":false,"messageTitle":"Fix checkstyle error","messageBody":"Trailing whitespace caused CI failure.","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e9fc98552a6a22b3b33f726be1b34f52912de7ab","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 1-update-aboutus-page","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b71585c3183a10f94fd44bdfa3b852eae0b6a976","isMergeCommit":true,"messageTitle":"Merge pull request #29 from AY2324S2-CS2103T-T15-4/7-update-user-guide","messageBody":"Close for v1.1","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"5685731453d0ea4b3c060c810728f11a2b5b2f46","isMergeCommit":false,"messageTitle":"Update index.md for project website","messageBody":"The main page of the project has not been update.\r\n\r\nKept things similar to the template for AB3, updated the name as well as the sources of the CI and codecov.","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}}]}],"azumieflare":[{"date":"2024-03-05","commitResults":[{"hash":"d647c7f4f40d9b9743aa9e42a29b6675915d1133","isMergeCommit":false,"messageTitle":"Edit about us","messageBody":"Updated self profile.\n","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":5}}},{"hash":"04b8660becaab6301fdb925dd243b65242036404","isMergeCommit":false,"messageTitle":"Edit README.md","messageBody":"Updated details of the app.\n","fileTypesAndContributionMap":{"docs":{"insertions":62,"deletions":11}}},{"hash":"bbe0a84623d81418e7997852c75729d2d09972e4","isMergeCommit":false,"messageTitle":"Undo changes","messageBody":"Removed updates done to AboutUs to isolate all\nchanges to README to this branch.\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":53}}},{"hash":"76935bcd649ba859b6933608cf19a72e65b72a78","isMergeCommit":false,"messageTitle":"Undo changes","messageBody":"Removed updates done.\n","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":62}}},{"hash":"63ba72b8e9df486f13ad08ea73e825ad568357aa","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Updated details of the app.\n","fileTypesAndContributionMap":{"docs":{"insertions":62,"deletions":11}}},{"hash":"6985d7a051cf367ff433d7fa41f19fac3c089554","isMergeCommit":false,"messageTitle":"Edit AboutUs.md","messageBody":"Updated self profile.\n","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":6}}},{"hash":"b52a462171b993fd0a5107f466840a84e13d60c0","isMergeCommit":false,"messageTitle":"Edit AboutUs.md","messageBody":"Fixed EOF error.\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"85c5c7eb7b0a9b6afc05525f4241631ae91166c1","isMergeCommit":false,"messageTitle":"Edit AboutUs.md","messageBody":"Fixed EOF error.\n","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"25d998b936655a4de4200fb2f087ea18b190e72e","isMergeCommit":true,"messageTitle":"Merge pull request #31 from AY2324S2-CS2103T-T15-4/1-update-aboutus-page","messageBody":"Merge AboutUs page for v1.1","fileTypesAndContributionMap":{}},{"hash":"50261fb4cc2955dc29aac52a5b8679ba86489772","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 8-update-dg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"aa0f4c1ec993bc5d571545977ac03f57a6b9831b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 7-update-user-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5ffd3a754edbce36809a124db2e2aa4d8e2e151a","isMergeCommit":true,"messageTitle":"Merge pull request #30 from AY2324S2-CS2103T-T15-4/8-update-dg","messageBody":"Close DG for v1.1","fileTypesAndContributionMap":{}},{"hash":"89794d44100e63504679a19084e9e2311175cff7","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into 7-update-user-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"343879f3cac8aa237a006d332a30af01aac2c2df","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Added missing commands","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"2cb1f9bf8886ee03f3b93df351bc71184b14a9ba","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"Updated product scope.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":7}}},{"hash":"3b4c02aca92d5f89e00d116ea55bd762b636028b","isMergeCommit":true,"messageTitle":"Merge pull request #34 from azumieflare/branch-DG","messageBody":"Branch dg","fileTypesAndContributionMap":{}}]}],"gavin331":[{"date":"2024-03-05","commitResults":[{"hash":"84d0974fd880fe1cc7606f217a72ae3dac757b62","isMergeCommit":true,"messageTitle":"Merge pull request #10 from BryanL2303/1-update-aboutus-page","messageBody":"Add profile for Bryan","fileTypesAndContributionMap":{}},{"hash":"c6190f8875b9b6e9135b75b7e936f173ae8ac7af","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":16}}},{"hash":"4f047714a2758b58b760a2243234d7216be1ac4b","isMergeCommit":true,"messageTitle":"Merge branch \u00271-update-aboutus-page\u0027 into 1-update-aboutus-page","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f438e87d9594b131c98f1b4d6eea6359112a36a0","isMergeCommit":true,"messageTitle":"Merge pull request #11 from BryanL2303/7-update-user-guide","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"e41f536708b723b838e647f9b39ddbb858421534","isMergeCommit":false,"messageTitle":"Add employee functions to UserGuide.md","messageBody":"Add \u0027adding employee\u0027, \u0027listing employees\u0027, \u0027deleting employee\u0027\nto the userguide. Also, I renamed parts of the code where we used\n\u0027address book\u0027 to \u0027TaskMasterPro\u0027.\n","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":12}}},{"hash":"bc95f46bc916b883fd0ba3f968419482a0114e67","isMergeCommit":true,"messageTitle":"Merge pull request #15 from AY2324S2-CS2103T-T15-4/5-update-readme-page","messageBody":"Update README","fileTypesAndContributionMap":{}},{"hash":"9019491d8737a75914331b26bae6aab9ad5de208","isMergeCommit":true,"messageTitle":"Merge pull request #16 from BryanL2303/8-update-dg","messageBody":"Update user stories and cases","fileTypesAndContributionMap":{}},{"hash":"9dd830944d442e2bcd68a3fc171021abdebaf8e3","isMergeCommit":false,"messageTitle":"Add use case for marking and unmarking a task","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":0}}}]},{"date":"2024-03-07","commitResults":[{"hash":"cf7a1e1288e064190019d60533018509c4dba410","isMergeCommit":true,"messageTitle":"Merge pull request #36 from AY2324S2-CS2103T-T15-4/8-update-dg","messageBody":"8 update dg","fileTypesAndContributionMap":{}},{"hash":"4dff5e5498c0cada0c69f951ce8550172726078e","isMergeCommit":false,"messageTitle":"Update NFR in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"ed2313bb1c10989b98ae25fab4cfa551e0713616","isMergeCommit":true,"messageTitle":"Merge pull request #37 from gavin331/35-add-nfr-to-dg","messageBody":"Update NFR in DG","fileTypesAndContributionMap":{}},{"hash":"d7e0dddca61cc70cc634ccae9cf0dd25a11eceda","isMergeCommit":true,"messageTitle":"Merge pull request #38 from AY2324S2-CS2103T-T15-4/35-add-nfr-to-dg","messageBody":"35 add nfr to dg","fileTypesAndContributionMap":{}}]}],"johnyoozhengxian":[{"date":"2024-03-06","commitResults":[{"hash":"f0055421a56a53954ec4cf42f72fb17046e06401","isMergeCommit":false,"messageTitle":"Add AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":0}}},{"hash":"2822ac4fff874b07776eca15eacbd33bff00eeba","isMergeCommit":false,"messageTitle":"Add UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":39,"deletions":0}}},{"hash":"f79813bb662d879ef9fb37c0bb5c0e4cfd4fe2bd","isMergeCommit":true,"messageTitle":"Merge branch \u00271-update-aboutus-page\u0027 into update-aboutus-page","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"e0457053ee64c493975e77818c54c20c87be9979","isMergeCommit":true,"messageTitle":"Merge pull request #28 from johnyoozhengxian/update-ug","messageBody":"Add UG","fileTypesAndContributionMap":{}},{"hash":"c0e02c3ffa515310761697163248f75498898d3b","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b1a19f35800f84c1fa7851eebeda25908269aff4","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}},{"hash":"28f75d466ae14ec5bc45b923c9ac20b2ec53477e","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}}]},{"date":"2024-03-08","commitResults":[{"hash":"294ba90c1a852f97f1394e30ba9db292feb990cf","isMergeCommit":false,"messageTitle":"Add UserGuide","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":30,"deletions":9},"other":{"insertions":3,"deletions":3},"docs":{"insertions":1,"deletions":1}}},{"hash":"c232d0a09104590ab010ef3d7a5efa244e2ad244","isMergeCommit":false,"messageTitle":"Add UserGuide with changes","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":3,"deletions":3}}},{"hash":"c1c1fb6dd922877243fdb93cf61e0c76086681c1","isMergeCommit":false,"messageTitle":"Add UserGuide with changes","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":10,"deletions":1}}},{"hash":"bc409503e678b7f9ae1b38fd913651ac38cc8908","isMergeCommit":false,"messageTitle":"Add UserGuide with changes","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":30}}},{"hash":"1571b0f4f75a29010e74d34ea62e50020aae0637","isMergeCommit":true,"messageTitle":"Merge pull request #40 from johnyoozhengxian/update-ug","messageBody":"Add UserGuide","fileTypesAndContributionMap":{}},{"hash":"1596f5e7e67dd4dbc21b2eca635eceaa7cf029a4","isMergeCommit":true,"messageTitle":"Merge pull request #41 from AY2324S2-CS2103T-T15-4/update-user-guide","messageBody":"Update user guide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"BryanL2303":{"docs":144,"functional-code":0,"test-code":0,"other":1},"azumieflare":{"docs":122,"functional-code":0,"test-code":0},"gavin331":{"docs":86,"functional-code":0,"test-code":0},"johnyoozhengxian":{"docs":81,"functional-code":0,"test-code":0}},"authorContributionVariance":{"BryanL2303":2212.0266,"azumieflare":9803.129,"gavin331":645.73334,"johnyoozhengxian":1148.0624},"authorDisplayNameMap":{"BryanL2303":"CS2103T-T15-4 BRYA.. YIN","azumieflare":"CS2103T-T15-4 CHAN..JOHN","gavin331":"CS2103T-T15-4 GAVI.. WEI","johnyoozhengxian":"CS2103T-T15-4 JOHN..XIAN"}} diff --git a/AY2324S2-CS2103T-T16-1_tp_master/commits.json b/AY2324S2-CS2103T-T16-1_tp_master/commits.json index d21e3444..c6901a33 100644 --- a/AY2324S2-CS2103T-T16-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-T16-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"dedsecrattle":[{"date":"2024-03-04","commitResults":[{"hash":"965314a181165c8f7dc259736df5b719b73d24ce","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"b088d98f65970f8d23b3ed36d7e962ae5e4e1ef0","isMergeCommit":true,"messageTitle":"Merge pull request #4 from AY2324S2-CS2103T-T16-1/dedsecrattle-patch-1","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"91268970f67506fd0db1ef88ec0c8e5b5aba6523","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"925705f1ba84e29db4e08fcc53bf6bb423cb6f26","isMergeCommit":true,"messageTitle":"Merge pull request #7 from AY2324S2-CS2103T-T16-1/dedsecrattle-patch-1","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"f0dc5a768545feaea7fa3dd9d78c32764643a076","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":16}}}]},{"date":"2024-03-05","commitResults":[{"hash":"2970353166be38dea479501a0228390e70a42b37","isMergeCommit":false,"messageTitle":"Update SiteWide Setting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2d02a5c9d7b60f5d0454bb9568ebda7513228b54","isMergeCommit":true,"messageTitle":"Merge pull request #8 from dedsecrattle/docs/about-us","messageBody":"Update AboutUs (Kumar Prabhat)","fileTypesAndContributionMap":{}},{"hash":"33b94379ae235c38142e608b65d4f23ab805f623","isMergeCommit":true,"messageTitle":"Merge pull request #9 from dedsecrattle/docs/site-setting","messageBody":"Update Site wide Settings","fileTypesAndContributionMap":{}},{"hash":"69327585afefc140495397f525b4a7ca444363d7","isMergeCommit":true,"messageTitle":"Merge pull request #11 from Austintjh19/docs/about-us","messageBody":"Update About Us (Tan Jun Heng) ","fileTypesAndContributionMap":{}},{"hash":"7289f3ce3ac17c546a87534f46d014aea21bac48","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":8}}},{"hash":"f406399c9627f12ee493062ab0d15a2ef02059ae","isMergeCommit":true,"messageTitle":"Merge pull request #13 from dedsecrattle/docs/read-me","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"3171e058d30a2be7d431a119bd803c5cab113548","isMergeCommit":false,"messageTitle":"Fix Typo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"dbec31fc11ca1b226ca307130299f2618a7262ff","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Li-Zizhen/AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"dcbf90096cb8a71ec954452f62899cc22e3308ec","isMergeCommit":true,"messageTitle":"Merge pull request #20 from ValenciaLim/docs/about-us","messageBody":"Add information to AboutUs","fileTypesAndContributionMap":{}},{"hash":"70ff1ecc5d750398429aa087d7ec525b1fa3a033","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":4}}},{"hash":"4819266c0845a5a7a9ce246255c1f4082d75fa98","isMergeCommit":true,"messageTitle":"Merge pull request #22 from Austintjh19/docs/dev-guide","messageBody":"Update Developer Guide ","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"d902c494a76fdffadecdc9c583029bfb18b6cfe8","isMergeCommit":true,"messageTitle":"Merge pull request #25 from Li-Zizhen/EditUsecase","messageBody":"Add Use cases.","fileTypesAndContributionMap":{}},{"hash":"85c519a3397a9a457038d2414441e9a61d268032","isMergeCommit":true,"messageTitle":"Merge pull request #26 from ValenciaLim/master","messageBody":"Add extensions to use cases in PR #25. Add Use Cases","fileTypesAndContributionMap":{}},{"hash":"b268e1bcc8382b0682cb09961192cd710c686bd2","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":0}}},{"hash":"fc43148a227ba361a4c4a69fda88ef4ab19c47f5","isMergeCommit":true,"messageTitle":"Merge pull request #27 from Li-Zizhen/Editpicture","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"60702a5f808aabff686008b2af4882206eaefe47","isMergeCommit":false,"messageTitle":"Fix DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":8}}},{"hash":"f1cbd0d323f31f185d773ea8006cea3ad1b42248","isMergeCommit":true,"messageTitle":"Merge pull request #30 from dedsecrattle/docs/developer-guide","messageBody":"Fix DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"ed9a15d71854996a888df0b79ace7a60337dd3bd","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"8f344bbae293935df144288ebb5f3b0cbd71d3b2","isMergeCommit":false,"messageTitle":"Update UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"2fafea64f2d31a71de0611c6bb275d8ae0418c7c","isMergeCommit":false,"messageTitle":"Update Title","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"177c51079e66c0fa67613d949eff46c08856ebe5","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Austintjh19/docs/user-guide","messageBody":"Update User Guide for Delete and Filter","fileTypesAndContributionMap":{}}]}],"Li-Zizhen":[{"date":"2024-03-05","commitResults":[{"hash":"e66f84129b0f266ebf381f3f4aa5dda455032d83","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-07","commitResults":[{"hash":"08786c6ad98b331802822a95abfb8e805ef69c10","isMergeCommit":false,"messageTitle":"Add Use cases.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":5}}},{"hash":"caffb0b2dd9acfa3a4e9d6aae7141d07ac7c08f5","isMergeCommit":false,"messageTitle":"Edit picture name in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7d1b2eeae56cfaa4f4fb3d4fa3885a3cc11c09f5","isMergeCommit":false,"messageTitle":"Edit Use Cases.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"Austintjh19":[{"date":"2024-03-05","commitResults":[{"hash":"27703ec1e16f67f7eb92d419e4b6fc6a7b7e1a77","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"638e76adfcd751b0c66216e79f98e01a6a2e51dc","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T16-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"652fdf693cc4e3e1c7c0b3e607d8622e387c8b98","isMergeCommit":false,"messageTitle":"Update About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"86714d56c368c133e76d9dfda5aac41bcf087bae","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ff484b13c7d64a9cbb9da80b05d8b8fc8af1fdc7","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2429d0aec3545f3fa915052e1c8750d7c631fe18","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into docs/about-us","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"afde696405adda696fe960c16a105e8c040db3fd","isMergeCommit":false,"messageTitle":"Update About Us Image File Format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"81bc5c243fe8f64857d71361f0cfce7c9d4f71cd","isMergeCommit":true,"messageTitle":"Merge pull request #14 from dedsecrattle/docs/read-me","messageBody":"Fix Typo","fileTypesAndContributionMap":{}},{"hash":"da02450a26e1a1b9870a2c96967851c2feb9cea5","isMergeCommit":true,"messageTitle":"Merge pull request #15 from Austintjh19/docs/about-us","messageBody":"Update About Us Image File Format","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"fbcc97656da180755277f242ba45df509b2eadf2","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7653f7150f80b41b1fa361c9a53b6e5f07fdbbaa","isMergeCommit":false,"messageTitle":"Update Developer Guide User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":9}}}]},{"date":"2024-03-07","commitResults":[{"hash":"b6bfd99e14c9656a7a20db792d2f0b362b500a64","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b272c70baa1cb1a5bb320d367557564ee592b546","isMergeCommit":true,"messageTitle":"Merge pull request #21 from dedsecrattle/docs/developer-guide","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}},{"hash":"46e0b45d2fca2604e23856d2858be4969bda454d","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T16-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"e634035d45261c0d74d2c6f8a93e07c203dfe031","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c5f834590329815e11511264f9714a21ada738c2","isMergeCommit":false,"messageTitle":"Update User Guide on Delete and Filter","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":5}}},{"hash":"d37b16c85bbe6b59db47d7ca689bcc2f1d083bb4","isMergeCommit":false,"messageTitle":"Update User Guide Key Summary Table","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"990fad39230558145203ddecf6ac161708351942","isMergeCommit":true,"messageTitle":"Merge pull request #31 from Li-Zizhen/Editpicture","messageBody":"Edit Use Cases for DG","fileTypesAndContributionMap":{}},{"hash":"999f0c020ab0a52e70db9af3074f470558607e6e","isMergeCommit":true,"messageTitle":"Merge pull request #33 from ValenciaLim/master","messageBody":"Update search feature in User Guide","fileTypesAndContributionMap":{}}]}],"ValenciaLim":[{"date":"2024-03-06","commitResults":[{"hash":"db35a09ffca09129fa9e2ab25f17d656351ad0dc","isMergeCommit":false,"messageTitle":"Add information to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"03fbab55020f1efc27d690a59c11a13d8898f2c6","isMergeCommit":true,"messageTitle":"Merge docs/about-us to implement changes to AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"460b84dcf96dca8d5f4e0be023d30c038441b2b6","isMergeCommit":false,"messageTitle":"Change image extension from .jpeg to .png in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"925db552f1e56cf6e98726dcaab93a8d15240c2f","isMergeCommit":true,"messageTitle":"Merge docs/about-us to implement changes to AboutUs","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"5c3967e68a9aee8ee850a4b0dbaf00a2e38b9102","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T16-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"431eb6918d490d11b09a11216fb32827a7816bab","isMergeCommit":false,"messageTitle":"Add extensions to Add a tag, Edit and Delete information use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":108,"deletions":16}}},{"hash":"227cf0ab490299319373c3372ede1b977349c388","isMergeCommit":true,"messageTitle":"Merge docs/developer-guide to implement changes to use cases in DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"39a7a7de606c8db9954401e4e6562ab3fa1d5d10","isMergeCommit":false,"messageTitle":"Modify search feature in User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":10}}},{"hash":"c3a21bd1e27898f242b95e9c4348afa01e77a3bc","isMergeCommit":true,"messageTitle":"Merge docs/user-guide to implement changes to UserGuide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"413b955d84c780f822fa063d7096ddae500467f9","isMergeCommit":true,"messageTitle":"Merge pull request #32 from dedsecrattle/docs/user-guide","messageBody":"Update user guide","fileTypesAndContributionMap":{}},{"hash":"c9c3f9ec9b037aa9efe5fa1f72dcf636706bd083","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T16-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"0482f8721d77298e6a7b8397de0ee1d7d6b29516","isMergeCommit":false,"messageTitle":"Modify search command format in User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"3ad2b24d3297d0f0e4c269cb08b9b941b6a6a778","isMergeCommit":true,"messageTitle":"Merge docs/user-guide to implement changes to UserGuide","messageBody":"","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"dedsecrattle":{"docs":42,"functional-code":0,"test-code":0},"Li-Zizhen":{"docs":4,"functional-code":0,"test-code":0},"Austintjh19":{"docs":30,"functional-code":0,"test-code":0},"ValenciaLim":{"docs":118,"functional-code":0,"test-code":0}},"authorContributionVariance":{"dedsecrattle":177.59692,"Li-Zizhen":95.83674,"Austintjh19":170.28572,"ValenciaLim":1483.6735},"authorDisplayNameMap":{"dedsecrattle":"CS2103T-T16-1 KUMA..BHAT","Li-Zizhen":"CS2103T-T16-1 LI Z..ZHEN","Austintjh19":"CS2103T-T16-1 TAN ..HENG","ValenciaLim":"CS2103T-T16-1 LIM ..NCIA"}} +{"authorDailyContributionsMap":{"dedsecrattle":[{"date":"2024-03-04","commitResults":[{"hash":"965314a181165c8f7dc259736df5b719b73d24ce","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"b088d98f65970f8d23b3ed36d7e962ae5e4e1ef0","isMergeCommit":true,"messageTitle":"Merge pull request #4 from AY2324S2-CS2103T-T16-1/dedsecrattle-patch-1","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"91268970f67506fd0db1ef88ec0c8e5b5aba6523","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"925705f1ba84e29db4e08fcc53bf6bb423cb6f26","isMergeCommit":true,"messageTitle":"Merge pull request #7 from AY2324S2-CS2103T-T16-1/dedsecrattle-patch-1","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"f0dc5a768545feaea7fa3dd9d78c32764643a076","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":16}}}]},{"date":"2024-03-05","commitResults":[{"hash":"2970353166be38dea479501a0228390e70a42b37","isMergeCommit":false,"messageTitle":"Update SiteWide Setting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2d02a5c9d7b60f5d0454bb9568ebda7513228b54","isMergeCommit":true,"messageTitle":"Merge pull request #8 from dedsecrattle/docs/about-us","messageBody":"Update AboutUs (Kumar Prabhat)","fileTypesAndContributionMap":{}},{"hash":"33b94379ae235c38142e608b65d4f23ab805f623","isMergeCommit":true,"messageTitle":"Merge pull request #9 from dedsecrattle/docs/site-setting","messageBody":"Update Site wide Settings","fileTypesAndContributionMap":{}},{"hash":"69327585afefc140495397f525b4a7ca444363d7","isMergeCommit":true,"messageTitle":"Merge pull request #11 from Austintjh19/docs/about-us","messageBody":"Update About Us (Tan Jun Heng) ","fileTypesAndContributionMap":{}},{"hash":"7289f3ce3ac17c546a87534f46d014aea21bac48","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":8}}},{"hash":"f406399c9627f12ee493062ab0d15a2ef02059ae","isMergeCommit":true,"messageTitle":"Merge pull request #13 from dedsecrattle/docs/read-me","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"3171e058d30a2be7d431a119bd803c5cab113548","isMergeCommit":false,"messageTitle":"Fix Typo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"dbec31fc11ca1b226ca307130299f2618a7262ff","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Li-Zizhen/AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"dcbf90096cb8a71ec954452f62899cc22e3308ec","isMergeCommit":true,"messageTitle":"Merge pull request #20 from ValenciaLim/docs/about-us","messageBody":"Add information to AboutUs","fileTypesAndContributionMap":{}},{"hash":"70ff1ecc5d750398429aa087d7ec525b1fa3a033","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":4}}},{"hash":"4819266c0845a5a7a9ce246255c1f4082d75fa98","isMergeCommit":true,"messageTitle":"Merge pull request #22 from Austintjh19/docs/dev-guide","messageBody":"Update Developer Guide ","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"d902c494a76fdffadecdc9c583029bfb18b6cfe8","isMergeCommit":true,"messageTitle":"Merge pull request #25 from Li-Zizhen/EditUsecase","messageBody":"Add Use cases.","fileTypesAndContributionMap":{}},{"hash":"85c519a3397a9a457038d2414441e9a61d268032","isMergeCommit":true,"messageTitle":"Merge pull request #26 from ValenciaLim/master","messageBody":"Add extensions to use cases in PR #25. Add Use Cases","fileTypesAndContributionMap":{}},{"hash":"b268e1bcc8382b0682cb09961192cd710c686bd2","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":0}}},{"hash":"fc43148a227ba361a4c4a69fda88ef4ab19c47f5","isMergeCommit":true,"messageTitle":"Merge pull request #27 from Li-Zizhen/Editpicture","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"60702a5f808aabff686008b2af4882206eaefe47","isMergeCommit":false,"messageTitle":"Fix DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":8}}},{"hash":"f1cbd0d323f31f185d773ea8006cea3ad1b42248","isMergeCommit":true,"messageTitle":"Merge pull request #30 from dedsecrattle/docs/developer-guide","messageBody":"Fix DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"ed9a15d71854996a888df0b79ace7a60337dd3bd","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}},{"hash":"8f344bbae293935df144288ebb5f3b0cbd71d3b2","isMergeCommit":false,"messageTitle":"Update UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"2fafea64f2d31a71de0611c6bb275d8ae0418c7c","isMergeCommit":false,"messageTitle":"Update Title","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"177c51079e66c0fa67613d949eff46c08856ebe5","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Austintjh19/docs/user-guide","messageBody":"Update User Guide for Delete and Filter","fileTypesAndContributionMap":{}}]}],"Li-Zizhen":[{"date":"2024-03-05","commitResults":[{"hash":"e66f84129b0f266ebf381f3f4aa5dda455032d83","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-07","commitResults":[{"hash":"08786c6ad98b331802822a95abfb8e805ef69c10","isMergeCommit":false,"messageTitle":"Add Use cases.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":5}}},{"hash":"caffb0b2dd9acfa3a4e9d6aae7141d07ac7c08f5","isMergeCommit":false,"messageTitle":"Edit picture name in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7d1b2eeae56cfaa4f4fb3d4fa3885a3cc11c09f5","isMergeCommit":false,"messageTitle":"Edit Use Cases.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"Austintjh19":[{"date":"2024-03-05","commitResults":[{"hash":"27703ec1e16f67f7eb92d419e4b6fc6a7b7e1a77","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"638e76adfcd751b0c66216e79f98e01a6a2e51dc","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T16-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"652fdf693cc4e3e1c7c0b3e607d8622e387c8b98","isMergeCommit":false,"messageTitle":"Update About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"86714d56c368c133e76d9dfda5aac41bcf087bae","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ff484b13c7d64a9cbb9da80b05d8b8fc8af1fdc7","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2429d0aec3545f3fa915052e1c8750d7c631fe18","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into docs/about-us","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"afde696405adda696fe960c16a105e8c040db3fd","isMergeCommit":false,"messageTitle":"Update About Us Image File Format","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"81bc5c243fe8f64857d71361f0cfce7c9d4f71cd","isMergeCommit":true,"messageTitle":"Merge pull request #14 from dedsecrattle/docs/read-me","messageBody":"Fix Typo","fileTypesAndContributionMap":{}},{"hash":"da02450a26e1a1b9870a2c96967851c2feb9cea5","isMergeCommit":true,"messageTitle":"Merge pull request #15 from Austintjh19/docs/about-us","messageBody":"Update About Us Image File Format","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"fbcc97656da180755277f242ba45df509b2eadf2","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7653f7150f80b41b1fa361c9a53b6e5f07fdbbaa","isMergeCommit":false,"messageTitle":"Update Developer Guide User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":9}}}]},{"date":"2024-03-07","commitResults":[{"hash":"b6bfd99e14c9656a7a20db792d2f0b362b500a64","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b272c70baa1cb1a5bb320d367557564ee592b546","isMergeCommit":true,"messageTitle":"Merge pull request #21 from dedsecrattle/docs/developer-guide","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}},{"hash":"46e0b45d2fca2604e23856d2858be4969bda454d","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T16-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"e634035d45261c0d74d2c6f8a93e07c203dfe031","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/Austintjh19/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c5f834590329815e11511264f9714a21ada738c2","isMergeCommit":false,"messageTitle":"Update User Guide on Delete and Filter","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":5}}},{"hash":"d37b16c85bbe6b59db47d7ca689bcc2f1d083bb4","isMergeCommit":false,"messageTitle":"Update User Guide Key Summary Table","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"990fad39230558145203ddecf6ac161708351942","isMergeCommit":true,"messageTitle":"Merge pull request #31 from Li-Zizhen/Editpicture","messageBody":"Edit Use Cases for DG","fileTypesAndContributionMap":{}},{"hash":"999f0c020ab0a52e70db9af3074f470558607e6e","isMergeCommit":true,"messageTitle":"Merge pull request #33 from ValenciaLim/master","messageBody":"Update search feature in User Guide","tags":["v1.1"],"fileTypesAndContributionMap":{}}]}],"ValenciaLim":[{"date":"2024-03-06","commitResults":[{"hash":"db35a09ffca09129fa9e2ab25f17d656351ad0dc","isMergeCommit":false,"messageTitle":"Add information to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"03fbab55020f1efc27d690a59c11a13d8898f2c6","isMergeCommit":true,"messageTitle":"Merge docs/about-us to implement changes to AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"460b84dcf96dca8d5f4e0be023d30c038441b2b6","isMergeCommit":false,"messageTitle":"Change image extension from .jpeg to .png in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"925db552f1e56cf6e98726dcaab93a8d15240c2f","isMergeCommit":true,"messageTitle":"Merge docs/about-us to implement changes to AboutUs","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"5c3967e68a9aee8ee850a4b0dbaf00a2e38b9102","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T16-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"431eb6918d490d11b09a11216fb32827a7816bab","isMergeCommit":false,"messageTitle":"Add extensions to Add a tag, Edit and Delete information use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":108,"deletions":16}}},{"hash":"227cf0ab490299319373c3372ede1b977349c388","isMergeCommit":true,"messageTitle":"Merge docs/developer-guide to implement changes to use cases in DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"39a7a7de606c8db9954401e4e6562ab3fa1d5d10","isMergeCommit":false,"messageTitle":"Modify search feature in User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":10}}},{"hash":"c3a21bd1e27898f242b95e9c4348afa01e77a3bc","isMergeCommit":true,"messageTitle":"Merge docs/user-guide to implement changes to UserGuide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"413b955d84c780f822fa063d7096ddae500467f9","isMergeCommit":true,"messageTitle":"Merge pull request #32 from dedsecrattle/docs/user-guide","messageBody":"Update user guide","fileTypesAndContributionMap":{}},{"hash":"c9c3f9ec9b037aa9efe5fa1f72dcf636706bd083","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T16-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"0482f8721d77298e6a7b8397de0ee1d7d6b29516","isMergeCommit":false,"messageTitle":"Modify search command format in User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"3ad2b24d3297d0f0e4c269cb08b9b941b6a6a778","isMergeCommit":true,"messageTitle":"Merge docs/user-guide to implement changes to UserGuide","messageBody":"","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"dedsecrattle":{"docs":42,"functional-code":0,"test-code":0},"Li-Zizhen":{"docs":4,"functional-code":0,"test-code":0},"Austintjh19":{"docs":30,"functional-code":0,"test-code":0},"ValenciaLim":{"docs":118,"functional-code":0,"test-code":0}},"authorContributionVariance":{"dedsecrattle":177.59692,"Li-Zizhen":95.83674,"Austintjh19":170.28572,"ValenciaLim":1483.6735},"authorDisplayNameMap":{"dedsecrattle":"CS2103T-T16-1 KUMA..BHAT","Li-Zizhen":"CS2103T-T16-1 LI Z..ZHEN","Austintjh19":"CS2103T-T16-1 TAN ..HENG","ValenciaLim":"CS2103T-T16-1 LIM ..NCIA"}} diff --git a/AY2324S2-CS2103T-T17-2_tp_master/authorship.json b/AY2324S2-CS2103T-T17-2_tp_master/authorship.json index c1202bd5..3fc9d646 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":"-"},"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":"shayaansultan"},"content":"### Shayaan Sultan","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"shayaansultan"},"content":"\u003cimg src\u003d\"images/shayaansultan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"shayaansultan"},"content":"[[github](http://github.com/shayaansultan)] [[portfolio](team/shayaansultan.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"shayaansultan"},"content":"* Responsibilities: Documentation, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"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":{"shayaansultan":4,"-":57}},{"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":"hjungwoo01"},"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":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"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":"-"},"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":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"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":332,"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":333,"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":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":340,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":350,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":351,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"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":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"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":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"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":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"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":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"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":385,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","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"}],"authorContributionMap":{"hjungwoo01":6,"-":389}},{"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/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/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}}] diff --git a/AY2324S2-CS2103T-T17-2_tp_master/commits.json b/AY2324S2-CS2103T-T17-2_tp_master/commits.json index 0054b2e7..045730d6 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}}}]}],"quelinxiao":[],"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":{}}]}],"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}}}]}]},"authorFileTypeContributionMap":{"PyromancerBoom":{"docs":34,"functional-code":0,"test-code":0},"quelinxiao":{"docs":0,"functional-code":0,"test-code":0},"hjungwoo01":{"docs":6,"functional-code":0,"test-code":0},"shayaansultan":{"docs":31,"functional-code":0,"test-code":0}},"authorContributionVariance":{"PyromancerBoom":280.22958,"quelinxiao":0.0,"hjungwoo01":14.92347,"shayaansultan":85.959175},"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":{}}]}],"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"}} diff --git a/AY2324S2-CS2103T-W09-1_tp_master/authorship.json b/AY2324S2-CS2103T-W09-1_tp_master/authorship.json index 7c600630..5c962bed 100644 --- a/AY2324S2-CS2103T-W09-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W09-1_tp_master/authorship.json @@ -1 +1 @@ -[{"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":"-"},"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":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","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":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","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":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"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":351,"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":352,"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":353,"author":{"gitId":"GERARDJM018"},"content":"4. All user operations should completed within 3 seconds.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"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":355,"author":{"gitId":"GERARDJM018"},"content":"6. Should not take memory more than 200 MB while in operation.","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"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":357,"author":{"gitId":"GERARDJM018"},"content":"8. Should be portable (able to work without requiring an installer).","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"GERARDJM018"},"content":"9. Should not use or depend on a remote server.","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":364,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"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":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"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":"\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":374,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"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":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"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":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"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":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"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":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"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":408,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"LimZiJia":42,"-":368,"GERARDJM018":8}}] +[{"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}}] diff --git a/AY2324S2-CS2103T-W09-1_tp_master/commits.json b/AY2324S2-CS2103T-W09-1_tp_master/commits.json index e954947b..cde1f635 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}}}]}],"moguries":[],"gosongying":[{"date":"2024-03-07","commitResults":[{"hash":"5e4572baf8a27a58e9332ced314704840132da9d","isMergeCommit":true,"messageTitle":"Merge pull request #22 from GERARDJM018/Developer-Guide","messageBody":"Update DeveloperGuide.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}}}]}]},"authorFileTypeContributionMap":{"LimZiJia":{"docs":42,"functional-code":0,"test-code":0},"moguries":{"docs":0,"functional-code":0,"test-code":0},"gosongying":{"docs":0,"functional-code":0,"test-code":0},"GERARDJM018":{"docs":8,"functional-code":0,"test-code":0}},"authorContributionVariance":{"LimZiJia":64613.25,"moguries":0.0,"gosongying":0.0,"GERARDJM018":8.025511},"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":{}}]}],"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"}} diff --git a/AY2324S2-CS2103T-W09-2_tp_master/authorship.json b/AY2324S2-CS2103T-W09-2_tp_master/authorship.json index 948d3448..ef7b6a8e 100644 --- a/AY2324S2-CS2103T-W09-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W09-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"menatahari"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W09-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W09-2/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"menatahari"},"content":"# Capital Connect #","lastModifiedDate":"2024-03-07"},{"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":"menatahari"},"content":"## Description ##","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"menatahari"},"content":"Capital Connect is an app that is designed to streamline the management of startup investments, enabling VC firms to easily add, categorize, and track a diverse portfolio of investments in various industries and funding stages.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"menatahari"},"content":"## Documentation ##","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"menatahari"},"content":"For the detailed documentation of this project, see the **[Capital Connect Product Website](https://ay2324s2-cs2103t-w09-2.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"menatahari"},"content":"## Credits and Acknowledgements ##","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"menatahari"},"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":{"menatahari":19,"-":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":"yeoshuheng"},"content":"### Yeo Shu Heng","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"\u003cimg src\u003d\"images/yeoshuheng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":"[[homepage](https://www.linkedin.com/in/yeoshuheng/)]","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"[[github](https://github.com/yeoshuheng)]","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":"[[portfolio](team/shuheng.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":"* Role: Developer","lastModifiedDate":"2024-02-25"},{"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":"yeoshuheng"},"content":"[[portfolio](team/shuheng.md)]","lastModifiedDate":"2024-02-25"},{"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":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/shuheng.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"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":"yeoshuheng"},"content":"[[portfolio](team/shuheng.md)]","lastModifiedDate":"2024-02-25"},{"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":"yeoshuheng"},"content":"[[portfolio](team/shuheng.md)]","lastModifiedDate":"2024-02-25"},{"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":{"-":51,"yeoshuheng":10}},{"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":"yespiggy"},"content":"# CapitalConnect 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":"-"},"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":"yespiggy"},"content":"**Target user profile**: A venture capital portfolio manager who","lastModifiedDate":"2024-03-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"yespiggy"},"content":"* has a need to keep a significant amount of startup investments","lastModifiedDate":"2024-03-07"},{"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":"yespiggy"},"content":"**Value proposition**: Venture capital firms manage diverse portfolios of startup ","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"yespiggy"},"content":"investments across various industries. The app streamlines the management of startup","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"yespiggy"},"content":"investments, enabling VC firms to easily add, categorize, and track a diverse ","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"yespiggy"},"content":"portfolio of investments in various industries and funding stages.","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"yespiggy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"yespiggy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"yespiggy"},"content":"|-----------|-------------------|-------------------------------------------------------|--------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | view the startup investments in my portfolio | see the list of startup investments that I\u0027m interested in |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | add a new startup investment to my portfolio | save the details of the new startup investment |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | delete a startup investment to my portfolio | remove the startup investment that I am no longer interested in |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"yespiggy"},"content":"| `* *` | user | find a startup investment by name | locate a startup investment without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"yespiggy"},"content":"| `* *` | intermediate user | assign funding stages to startup investments | know more about the startup investment when checking it through the app |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"yespiggy"},"content":"| `* *` | intermediate user | find a startup investment by industry \u0026 funding stage | locate a startup investment without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"yespiggy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"yespiggy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"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":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"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":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"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":340,"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":341,"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":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":348,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":358,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":359,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"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":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"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":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"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":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"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":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"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":393,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"yespiggy":18,"-":385}},{"path":"docs/team/shuheng.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: \"John Doe\u0027s Project Portfolio Page\"","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":"### 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":"yeoshuheng"},"content":"* **New Feature**: Added the ability to add startups to the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" * What it does: This allows users to add startups to Capital Connect alongside information such as funding stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" * Justification: This is imperative for our users as they consist of key information they have to track.","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"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":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"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":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"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":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":41,"yeoshuheng":3}},{"path":"src/main/java/seedu/address/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2023-07-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.Prefix;","lastModifiedDate":"2023-07-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFields);","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" .append(\"; Industry: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" .append(person.getIndustry())","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" .append(\"; Funding Stage: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" .append(person.getFundingStage())","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .append(\"; Tags: \");","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" person.getTags().forEach(builder::append);","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":51,"yeoshuheng":4}},{"path":"src/main/java/seedu/address/logic/commands/AddCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"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.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-01-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" + PREFIX_INDUSTRY + \"INDUSTRY \"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" + PREFIX_FUNDING_STAGE + \"FUNDING STAGE \"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"friends \"","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"owesMoney\";","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":84,"yeoshuheng":4}},{"path":"src/main/java/seedu/address/logic/commands/EditCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-12-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.CollectionUtil;","lastModifiedDate":"2016-12-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" + \"[\" + PREFIX_INDUSTRY + \"INDUSTRY\" + \"] \"","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" + \"[\" + PREFIX_FUNDING_STAGE + \"FUNDING STAGE] \"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":93,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" FundingStage updatedFundingStage \u003d editPersonDescriptor.getFundingStage().orElse(","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" personToEdit.getFundingStage());","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" Industry updatedIndustry \u003d editPersonDescriptor.getIndustry().orElse(personToEdit.getIndustry());","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":110,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" return new Person(updatedName, updatedFundingStage, updatedIndustry,","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":" updatedPhone, updatedEmail, updatedAddress, updatedTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":144,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":147,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" private Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"yeoshuheng"},"content":" private FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":153,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":154,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":155,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-06-21"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":162,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":163,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":164,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" setFundingStage(toCopy.fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":" setIndustry(toCopy.industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":168,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":169,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":170,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" return CollectionUtil.isAnyNonNull(name, industry, fundingStage, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":178,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":179,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":180,"author":{"gitId":"yeoshuheng"},"content":" public void setIndustry(Industry industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":181,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":182,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":183,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":184,"author":{"gitId":"yeoshuheng"},"content":" public void setFundingStage(FundingStage fundingStage) {","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":189,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":192,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":193,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" public Optional\u003cIndustry\u003e getIndustry() {","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" return Optional.ofNullable(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":199,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":200,"author":{"gitId":"yeoshuheng"},"content":" public Optional\u003cFundingStage\u003e getFundingStage() {","lastModifiedDate":"2024-02-25"},{"lineNumber":201,"author":{"gitId":"yeoshuheng"},"content":" return Optional.ofNullable(fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":204,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":205,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":206,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":208,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":209,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":212,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":213,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":216,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":217,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":218,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":220,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":221,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":222,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":224,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":225,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","lastModifiedDate":"2017-06-21"},{"lineNumber":226,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":228,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Sets {@code tags} to this object\u0027s {@code tags}.","lastModifiedDate":"2018-01-11"},{"lineNumber":230,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":231,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":232,"author":{"gitId":"-"},"content":" public void setTags(Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-06-21"},{"lineNumber":233,"author":{"gitId":"-"},"content":" this.tags \u003d (tags !\u003d null) ? new HashSet\u003c\u003e(tags) : null;","lastModifiedDate":"2018-01-11"},{"lineNumber":234,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":236,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2018-01-11"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":239,"author":{"gitId":"-"},"content":" * Returns {@code Optional#empty()} if {@code tags} is null.","lastModifiedDate":"2018-01-11"},{"lineNumber":240,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":241,"author":{"gitId":"-"},"content":" public Optional\u003cSet\u003cTag\u003e\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":242,"author":{"gitId":"-"},"content":" return (tags !\u003d null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();","lastModifiedDate":"2018-01-11"},{"lineNumber":243,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":246,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":247,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":248,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":249,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":251,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":252,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":253,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":256,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":257,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":258,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":259,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 Objects.equals(fundingStage, otherEditPersonDescriptor.fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":260,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 Objects.equals(industry, otherEditPersonDescriptor.industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":261,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":262,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":263,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":270,"author":{"gitId":"yeoshuheng"},"content":" .add(\"industry\", industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":271,"author":{"gitId":"yeoshuheng"},"content":" .add(\"funding stage\", fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":272,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":279,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"-":240,"yeoshuheng":39}},{"path":"src/main/java/seedu/address/logic/parser/AddCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-02-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME,","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_INDUSTRY, PREFIX_FUNDING_STAGE, PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_INDUSTRY,","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_FUNDING_STAGE, PREFIX_ADDRESS,","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_FUNDING_STAGE, PREFIX_INDUSTRY);","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" FundingStage fundingStage \u003d ParserUtil.parseFundingStage(argMultimap.getValue(PREFIX_FUNDING_STAGE).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" Industry industry \u003d ParserUtil.parseIndustry(argMultimap.getValue(PREFIX_INDUSTRY).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagList \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" Person person \u003d new Person(name, fundingStage, industry, phone, email, address, tagList);","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"-":57,"yeoshuheng":15}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":" public static final Prefix PREFIX_INDUSTRY \u003d new Prefix(\"i/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final Prefix PREFIX_FUNDING_STAGE \u003d new Prefix(\"f/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":15,"yeoshuheng":2}},{"path":"src/main/java/seedu/address/logic/parser/EditCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" ArgumentTokenizer.tokenize(args, CliSyntax.PREFIX_NAME,","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_INDUSTRY, CliSyntax.PREFIX_FUNDING_STAGE, CliSyntax.PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS, CliSyntax.PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(CliSyntax.PREFIX_NAME, CliSyntax.PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS);","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_NAME).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(CliSyntax.PREFIX_NAME).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_FUNDING_STAGE).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setFundingStage(","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parseFundingStage(argMultimap.getValue(CliSyntax.PREFIX_FUNDING_STAGE).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_INDUSTRY).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setIndustry(","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parseIndustry(argMultimap.getValue(CliSyntax.PREFIX_INDUSTRY).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setPhone(","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parsePhone(argMultimap.getValue(CliSyntax.PREFIX_PHONE).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(CliSyntax.PREFIX_EMAIL).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.getValue(CliSyntax.PREFIX_ADDRESS).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" parseTagsForEdit(argMultimap.getAllValues(CliSyntax.PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2017-03-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2017-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private Optional\u003cSet\u003cTag\u003e\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2017-01-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2017-01-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2017-01-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":69,"yeoshuheng":24}},{"path":"src/main/java/seedu/address/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":33,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":35,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" * Parses a {@code String industry} into a {@code Industry}.","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" * @throws ParseException if the given {@code industry} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" public static Industry parseIndustry(String industry) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" String trimmedIndustry \u003d industry.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" if (!Industry.isValidIndustry(trimmedIndustry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" throw new ParseException(Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" return new Industry(trimmedIndustry);","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" * Parses a {@code String fundingLevel} into a {@code FundingStage}.","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":" * @throws ParseException if the given {@code fundingStage} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"yeoshuheng"},"content":" public static FundingStage parseFundingStage(String fundingLevel) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" String trimmedFundingLevel \u003d fundingLevel.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" if (!FundingStage.isValidFundingLevel(fundingLevel)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" throw new ParseException(FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"yeoshuheng"},"content":" return new FundingStage(trimmedFundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":89,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":104,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":109,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":110,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":111,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":116,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":119,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":121,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":123,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":125,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":126,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":131,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":134,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":136,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":138,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":141,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":148,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":149,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":150,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":152,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":153,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":155,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":157,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":124,"yeoshuheng":33}},{"path":"src/main/java/seedu/address/model/person/FundingStage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"/**","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":" * Represents funding stage of current project.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class FundingStage {","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" \"Funding stages should be either \u0027A\u0027, \u0027B\u0027 or \u0027C\u0027.\";","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" public final String value;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" * Constructor for a funding stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" * @param fundingLevel The funding level (A, B, C) of the current stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" public FundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" fundingLevel \u003d fundingLevel.toUpperCase();","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" checkArgument(isValidFundingLevel(fundingLevel), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" value \u003d fundingLevel;","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" * Returns true if a given industry is a valid industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" public static boolean isValidFundingLevel(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" return fundingLevel.equals(\"A\") || fundingLevel.equals(\"B\") || fundingLevel.equals(\"C\");","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" return true;","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" if (!(other instanceof FundingStage)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" FundingStage otherFundingStage \u003d (FundingStage) other;","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" return value.equals(otherFundingStage.value);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" public String toString() {","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" return this.value;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"yeoshuheng":53}},{"path":"src/main/java/seedu/address/model/person/Industry.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"/**","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":" * Represents industry person is from.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class Industry {","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" \"Industry names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" /*","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" public final String value;","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" * Constructor for an industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" * @param industry Name of the industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" public Industry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" checkArgument(isValidIndustry(industry), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" value \u003d industry.toUpperCase();","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" * Returns true if a given industry is a valid industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public static boolean isValidIndustry(String test) {","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" public String toString() {","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" return this.value;","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" return true;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" if (!(other instanceof Industry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" Industry otherIndustry \u003d (Industry) other;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" return value.equals(otherIndustry.value);","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"yeoshuheng":58}},{"path":"src/main/java/seedu/address/model/person/Person.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 seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2017-05-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" private final FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" private final Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" public Person(Name name, FundingStage fundingStage, Industry industry,","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" Phone phone, Email email, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" requireAllNonNull(name, fundingStage, industry, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" public FundingStage getFundingStage() {","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" return this.fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" public Industry getIndustry() {","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" return this.industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":100,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 industry.equals(otherPerson.industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 fundingStage.equals(otherPerson.fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":124,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":125,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"yeoshuheng"},"content":" .add(\"industry\", industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"yeoshuheng"},"content":" .add(\"funding stage\", fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":115,"yeoshuheng":22}},{"path":"src/main/java/seedu/address/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.util;","lastModifiedDate":"2016-12-20"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-14"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Alex Yeoh\"), new FundingStage(\"A\"), new Industry(\"Finance\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Bernice Yu\"), new FundingStage(\"B\"), new Industry(\"GreenTech\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new FundingStage(\"C\"), new Industry(\"Health\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"David Li\"), new FundingStage(\"A\"), new Industry(\"Manufacturing\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new FundingStage(\"C\"), new Industry(\"Tech\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new FundingStage(\"A\"), new Industry(\"Food\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"-":54,"yeoshuheng":14}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" private final String industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" private final String fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"industry\") String industry,","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" @JsonProperty(\"fundingStage\") String fundingStage, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags) {","lastModifiedDate":"2023-05-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d source.getIndustry().value;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d source.getFundingStage().value;","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"yeoshuheng"},"content":" if (industry \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" Industry.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"yeoshuheng"},"content":" if (!Industry.isValidIndustry(industry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"yeoshuheng"},"content":" final Industry modelIndustry \u003d new Industry(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"yeoshuheng"},"content":" if (fundingStage \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT,","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" FundingStage.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" if (!FundingStage.isValidFundingLevel(fundingStage)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" final FundingStage modelFundingStage \u003d new FundingStage(fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":133,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":135,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":136,"author":{"gitId":"yeoshuheng"},"content":" return new Person(modelName, modelFundingStage, modelIndustry, modelPhone, modelEmail, modelAddress, modelTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":139,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":107,"yeoshuheng":32}},{"path":"src/test/java/seedu/address/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2016-09-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.CommandResult;","lastModifiedDate":"2017-01-18"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ListCommand;","lastModifiedDate":"2017-06-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2016-09-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2016-09-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonAddressBookStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonUserPrefsStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.storage.StorageManager;","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":60,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String listCommand \u003d ListCommand.COMMAND_WORD;","lastModifiedDate":"2017-06-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2017-06-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":94,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":112,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":127,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":137,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":141,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":142,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":149,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":150,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":153,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":156,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":159,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":160,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" String addCommand \u003d AddCommand.COMMAND_WORD + CommandTestUtil.FUNDING_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_AMY + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":170,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":173,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"-":169,"yeoshuheng":4}},{"path":"src/test/java/seedu/address/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.parser.CliSyntax;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_INDUSTRY_BOB \u003d \"Finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_INDUSTRY_AMY \u003d \"Finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_FUNDING_BOB \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_FUNDING_AMY \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" public static final String INDUSTRY_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + VALID_INDUSTRY_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" public static final String INDUSTRY_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + VALID_INDUSTRY_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" public static final String FUNDING_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + VALID_FUNDING_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" public static final String FUNDING_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + VALID_FUNDING_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_NAME_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_TAG_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_INDUSTRY_DESC \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_FUNDING_DESC \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + \"D\";","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":" .withTags(VALID_TAG_FRIEND).withIndustry(VALID_INDUSTRY_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" .withFundingStage(VALID_FUNDING_AMY).build();","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" .withFundingStage(VALID_FUNDING_BOB).withIndustry(VALID_INDUSTRY_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":100,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":109,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":111,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":118,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":125,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":127,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":134,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":143,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"-":107,"yeoshuheng":41}},{"path":"src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptorWithSameValues \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(DESC_AMY));","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(null));","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(5));","lastModifiedDate":"2017-05-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(DESC_BOB));","lastModifiedDate":"2017-05-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String expected \u003d EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getName().orElse(null) + \", industry\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getIndustry().orElse(null) + \", funding stage\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getFundingStage().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", address\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getAddress().orElse(null) + \", tags\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getTags().orElse(null) + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":70,"yeoshuheng":3}},{"path":"src/test/java/seedu/address/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-07-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-06-15"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-06-15"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-06-15"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-06-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-06-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2017-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withTags(CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, CommandTestUtil.PREAMBLE_WHITESPACE","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // multiple tags - all accepted","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).withTags(","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_TAG_FRIEND, CommandTestUtil.VALID_TAG_HUSBAND)","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2023-07-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" String validExpectedPersonString \u003d CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" // multiple funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.FUNDING_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" // multiple industry","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INDUSTRY_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" validExpectedPersonString + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.NAME_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME,","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_ADDRESS, CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_INDUSTRY_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_FUNDING_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":115,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" // valid value followed by invalid value","lastModifiedDate":"2023-07-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_NAME_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_EMAIL_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":128,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_PHONE_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":132,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":134,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":135,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":136,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_INDUSTRY_DESC,","lastModifiedDate":"2024-03-05"},{"lineNumber":137,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":138,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":139,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":140,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_FUNDING_DESC,","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":146,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, CommandTestUtil.NAME_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"-"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":155,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-06-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":161,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":162,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":163,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":164,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":169,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_PHONE_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":170,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":173,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":174,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":175,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":176,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.VALID_EMAIL_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":178,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":180,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":181,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":182,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":183,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":184,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":187,"author":{"gitId":"yeoshuheng"},"content":" // missing industry prefix","lastModifiedDate":"2024-03-05"},{"lineNumber":188,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":189,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"yeoshuheng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-05"},{"lineNumber":193,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":194,"author":{"gitId":"yeoshuheng"},"content":" // missing funding stage prefix","lastModifiedDate":"2024-03-05"},{"lineNumber":195,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-05"},{"lineNumber":199,"author":{"gitId":"yeoshuheng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-05"},{"lineNumber":200,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":201,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":204,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_PHONE_BOB + CommandTestUtil.VALID_EMAIL_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":205,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":206,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":209,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":210,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":211,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":212,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":213,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":214,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":215,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":216,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":217,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":219,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":220,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":221,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":222,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":224,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":225,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":227,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":228,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":229,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":230,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":231,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":232,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":233,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":235,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":236,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":237,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":238,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":239,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":240,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":241,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":243,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":244,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":245,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":246,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.INVALID_FUNDING_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":247,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":248,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":249,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":250,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":251,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":252,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":253,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":254,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":255,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INVALID_INDUSTRY_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":256,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":257,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":258,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":260,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2017-06-15"},{"lineNumber":261,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":262,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":263,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":264,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":265,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_TAG_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":266,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":268,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":269,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":270,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":271,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":272,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":273,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":276,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.PREAMBLE_NON_EMPTY","lastModifiedDate":"2024-02-25"},{"lineNumber":277,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":278,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":279,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":280,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":281,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-12-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":283,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"-":117,"yeoshuheng":166}},{"path":"src/test/java/seedu/address/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-05-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-05-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-05-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-05-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-05-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String TAG_EMPTY \u003d \" \" + PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-05-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2017-05-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-07-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"-5\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"0\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1 x/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2024-03-05"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2024-03-05"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":82,"author":{"gitId":"-"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2017-05-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2017-05-04"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" + TAG_EMPTY, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" + TAG_EMPTY + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\" + TAG_EMPTY","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_AMY + CommandTestUtil.VALID_PHONE_AMY,","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":105,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-05"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_AMY)","lastModifiedDate":"2024-03-05"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" .withPhone(CommandTestUtil.VALID_PHONE_BOB).withEmail(","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_EMAIL_AMY).withAddress(CommandTestUtil.VALID_ADDRESS_AMY)","lastModifiedDate":"2024-03-05"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" .withTags(CommandTestUtil.VALID_TAG_HUSBAND, CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(CommandTestUtil.VALID_PHONE_BOB)","lastModifiedDate":"2024-03-05"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":131,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":133,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":134,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(","lastModifiedDate":"2024-03-05"},{"lineNumber":135,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_NAME_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":136,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":137,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":139,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":140,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_PHONE_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":143,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":146,"author":{"gitId":"-"},"content":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":147,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(","lastModifiedDate":"2024-03-05"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // address","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":155,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(","lastModifiedDate":"2024-03-05"},{"lineNumber":156,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_ADDRESS_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":157,"author":{"gitId":"yeoshuheng"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-05"},{"lineNumber":158,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-05"},{"lineNumber":159,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":160,"author":{"gitId":"yeoshuheng"},"content":" // industry","lastModifiedDate":"2024-03-05"},{"lineNumber":161,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INDUSTRY_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":162,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withIndustry(","lastModifiedDate":"2024-03-05"},{"lineNumber":163,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_INDUSTRY_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":164,"author":{"gitId":"yeoshuheng"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-05"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-05"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" // funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":168,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.FUNDING_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":169,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withFundingStage(","lastModifiedDate":"2024-03-05"},{"lineNumber":170,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_FUNDING_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":172,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // tags","lastModifiedDate":"2017-05-04"},{"lineNumber":175,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-05"},{"lineNumber":176,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(","lastModifiedDate":"2024-03-05"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":178,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":180,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":182,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":183,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":184,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":185,"author":{"gitId":"-"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2023-07-14"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":187,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":188,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":189,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased()","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":193,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":195,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":199,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":201,"author":{"gitId":"-"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":204,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":205,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":206,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":207,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":208,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2024-03-05"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":210,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":211,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":213,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":214,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":215,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":216,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":217,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":219,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":220,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":221,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":223,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":224,"author":{"gitId":"-"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":225,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":226,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2017-05-25"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":228,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2017-05-04"},{"lineNumber":229,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":231,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":232,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":233,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"-":147,"yeoshuheng":86}},{"path":"src/test/java/seedu/address/model/person/FundingStageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class FundingStageTest {","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e new FundingStage(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_invalidFundingStage_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" String invalidPhone \u003d \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new FundingStage(invalidPhone));","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" public void isValidFundingStage() {","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" // null funding","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e FundingStage.isValidFundingLevel(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding levels","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"\")); // empty string","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\" \")); // spaces only","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"AB\")); // invalid funding level","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"1\")); // numbers","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"D\")); // invalid funding level","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" // valid funding levels","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"A\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"B\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"C\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" public void equals() {","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" FundingStage fundingStage \u003d new FundingStage(\"A\");","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(fundingStage.equals(new FundingStage(\"A\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(fundingStage.equals(fundingStage));","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(5.0f));","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(new FundingStage(\"B\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"yeoshuheng":59}},{"path":"src/test/java/seedu/address/model/person/IndustryTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class IndustryTest {","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Industry(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_invalidIndustry_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" String invalidName \u003d \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Industry(invalidName));","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" public void isValidIndustry() {","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e Industry.isValidIndustry(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"\")); // empty string","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\" \")); // spaces only","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"finance*\")); // contains non-alphanumeric characters","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"Finance\")); // alphabets only","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"MANUFACTURING\")); // all capital","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"web 3\")); // with numbers","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public void equals() {","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" Industry industry \u003d new Industry(\"Valid Industry\");","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(industry.equals(new Industry(\"Valid Industry\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(industry.equals(industry));","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(5.0f));","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(new Industry(\"Other Valid Industry\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"yeoshuheng":53}},{"path":"src/test/java/seedu/address/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2018-03-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2018-04-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2018-04-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-03-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonTest {","lastModifiedDate":"2018-03-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2018-03-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void isSamePerson() {","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2020-12-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2020-12-18"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2020-12-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Person editedBob \u003d new PersonBuilder(BOB).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2020-12-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" editedBob \u003d new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-04-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Person aliceCopy \u003d new PersonBuilder(ALICE).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(aliceCopy));","lastModifiedDate":"2018-04-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // different type -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(5));","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(BOB));","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2018-04-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2018-04-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + ALICE.getName()","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" + \", industry\u003d\" + ALICE.getIndustry() + \", funding stage\u003d\" + ALICE.getFundingStage()","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"yeoshuheng"},"content":" + \", phone\u003d\" + ALICE.getPhone()","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" + \", email\u003d\" + ALICE.getEmail() + \", address\u003d\" + ALICE.getAddress() + \", tags\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" + ALICE.getTags() + \"}\";","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expected, ALICE.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"-":97,"yeoshuheng":5}},{"path":"src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.storage.JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" private static final String INVALID_FUNDING \u003d \"D\";","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" private static final String INVALID_INDUSTRY \u003d \" \";","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d BENSON.getName().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d BENSON.getPhone().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d BENSON.getEmail().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d BENSON.getAddress().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" private static final String VALID_FUNDING \u003d BENSON.getFundingStage().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" private static final String VALID_INDUSTRY \u003d BENSON.getIndustry().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d BENSON.getTags().stream()","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(BENSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertEquals(BENSON, person.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(null, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":101,"yeoshuheng":26}},{"path":"src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-12-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setIndustry(person.getIndustry());","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setFundingStage(person.getFundingStage());","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code FundingStage} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" public EditPersonDescriptorBuilder withFundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setFundingStage(new FundingStage(fundingLevel));","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code Industry} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" public EditPersonDescriptorBuilder withIndustry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setIndustry(new Industry(industry));","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":74,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2017-07-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagSet \u003d Stream.of(tags).map(Tag::new).collect(Collectors.toSet());","lastModifiedDate":"2017-12-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":" descriptor.setTags(tagSet);","lastModifiedDate":"2017-12-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":87,"yeoshuheng":20}},{"path":"src/test/java/seedu/address/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-04-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.util.SampleDataUtil;","lastModifiedDate":"2017-04-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" public static final String DEFAULT_INDUSTRY \u003d \"finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" public static final String DEFAULT_FUNDING \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" private Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" private FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":45,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d new Industry(DEFAULT_INDUSTRY);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d new FundingStage(DEFAULT_FUNDING);","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d personToCopy.getIndustry();","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d personToCopy.getFundingStage();","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":63,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":64,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":95,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":99,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code fundingStage} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" public PersonBuilder withFundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d new FundingStage(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code industry} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":117,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":118,"author":{"gitId":"yeoshuheng"},"content":" public PersonBuilder withIndustry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d new Industry(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":125,"author":{"gitId":"yeoshuheng"},"content":" return new Person(name, fundingStage, industry, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"-":95,"yeoshuheng":33}},{"path":"src/test/java/seedu/address/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-04-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-03-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-03-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2018-03-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-03-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2017-03-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_FUNDING_STAGE + person.getFundingStage().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_INDUSTRY + person.getIndustry().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2017-05-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2017-05-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {","lastModifiedDate":"2018-03-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" descriptor.getIndustry().ifPresent(industry -\u003e sb.append(PREFIX_INDUSTRY).append(industry.value).append(\" \"));","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" descriptor.getFundingStage().ifPresent(fundingStage -\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_FUNDING_STAGE).append(fundingStage.value).append(\" \"));","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2018-03-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2018-03-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" tags.forEach(s -\u003e sb.append(PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"-":62,"yeoshuheng":7}},{"path":"src/test/java/seedu/address/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-08-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-08-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final Person ALICE \u003d new PersonBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" .withPhone(\"94351253\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" .withTags(\"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final Person BENSON \u003d new PersonBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2018-01-10"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withTags(\"owesMoney\", \"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final Person CARL \u003d new PersonBuilder().withName(\"Carl Kurz\").withPhone(\"95352563\")","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"heinz@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"wall street\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final Person DANIEL \u003d new PersonBuilder().withName(\"Daniel Meier\").withPhone(\"87652533\")","lastModifiedDate":"2018-01-10"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"cornelia@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"10th street\").withTags(\"friends\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final Person ELLE \u003d new PersonBuilder().withName(\"Elle Meyer\").withPhone(\"9482224\")","lastModifiedDate":"2018-01-10"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"werner@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"michegan ave\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final Person FIONA \u003d new PersonBuilder().withName(\"Fiona Kunz\").withPhone(\"9482427\")","lastModifiedDate":"2018-01-10"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"lydia@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"little tokyo\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final Person GEORGE \u003d new PersonBuilder().withName(\"George Best\").withPhone(\"9482442\")","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"anna@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"4th street\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final Person HOON \u003d new PersonBuilder().withName(\"Hoon Meier\").withPhone(\"8482424\")","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"stefan@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"little india\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final Person IDA \u003d new PersonBuilder().withName(\"Ida Mueller\").withPhone(\"8482131\")","lastModifiedDate":"2018-01-10"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"hans@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"chicago ave\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final Person AMY \u003d new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2018-01-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-09-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final Person BOB \u003d new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2018-01-10"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)","lastModifiedDate":"2017-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"-":67,"yeoshuheng":16}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"menatahari"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W09-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W09-2/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"menatahari"},"content":"# Capital Connect #","lastModifiedDate":"2024-03-07"},{"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":"menatahari"},"content":"## Description ##","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"menatahari"},"content":"Capital Connect is an app that is designed to streamline the management of startup investments, enabling VC firms to easily add, categorize, and track a diverse portfolio of investments in various industries and funding stages.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"menatahari"},"content":"## Documentation ##","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"menatahari"},"content":"For the detailed documentation of this project, see the **[Capital Connect Product Website](https://ay2324s2-cs2103t-w09-2.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"menatahari"},"content":"## Credits and Acknowledgements ##","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"menatahari"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"menatahari"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"menatahari"},"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":{"menatahari":19,"-":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":"yeoshuheng"},"content":"### Yeo Shu Heng","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"\u003cimg src\u003d\"images/yeoshuheng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":"[[homepage](https://www.linkedin.com/in/yeoshuheng/)]","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"[[github](https://github.com/yeoshuheng)]","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":"[[portfolio](team/shuheng.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":"* Role: Developer","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"### Daniel Wang","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":"\u003cimg src\u003d\"images/wangwenkaidaniel.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":"[[github](http://github.com/dwangwk)]","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":"[[portfolio](team/danielwang.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":"### Ye Si Fan","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":"\u003cimg src\u003d\"images/yesifan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":"[[github](http://github.com/yespiggy)] [[portfolio](team/sifan.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"dwangwk"},"content":"### Natasya Hadiatullah Buhari","lastModifiedDate":"2024-03-07"},{"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":"dwangwk"},"content":"[[github](http://github.com/menatahari)]","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"dwangwk"},"content":"[[portfolio](team/natasya.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"dwangwk"},"content":"* Responsibilities: Dev Ops","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":12,"-":33,"yeoshuheng":6}},{"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":"yespiggy"},"content":"# CapitalConnect 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":"-"},"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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"yespiggy"},"content":"**Target user profile**: A venture capital portfolio manager who","lastModifiedDate":"2024-03-07"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"yespiggy"},"content":"* has a need to keep a significant amount of startup investments","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"yespiggy"},"content":"**Value proposition**: Venture capital firms manage diverse portfolios of startup ","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"yespiggy"},"content":"investments across various industries. The app streamlines the management of startup","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"yespiggy"},"content":"investments, enabling VC firms to easily add, categorize, and track a diverse ","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"yespiggy"},"content":"portfolio of investments in various industries and funding stages.","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"yespiggy"},"content":"|-----------|-------------------|-------------------------------------------------------|--------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | view the startup investments in my portfolio | see the list of startup investments that I\u0027m interested in |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | add a new startup investment to my portfolio | save the details of the new startup investment |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"yespiggy"},"content":"| `* * *` | user | delete a startup investment to my portfolio | remove the startup investment that I am no longer interested in |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"yespiggy"},"content":"| `* *` | user | find a startup investment by name | locate a startup investment without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"yespiggy"},"content":"| `* *` | intermediate user | assign funding stages to startup investments | know more about the startup investment when checking it through the app |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"yespiggy"},"content":"| `* *` | intermediate user | find a startup investment by industry \u0026 funding stage | locate a startup investment without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"yespiggy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"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":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"dwangwk"},"content":"**Use case: Add a startup investment**","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"dwangwk"},"content":"1. User requests to add a new startup investment to their portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to provide details including:","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"dwangwk"},"content":" * Startup name","lastModifiedDate":"2024-03-07"},{"lineNumber":317,"author":{"gitId":"dwangwk"},"content":" * Industry","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"dwangwk"},"content":" * Funding stage","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"dwangwk"},"content":" * Address","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"dwangwk"},"content":" * Contact information","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"dwangwk"},"content":"3. User provides the necessary details.","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect adds the new startup investment to the user\u0027s portfolio in the dashboard.","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"dwangwk"},"content":"* 4b. Startup name already exists in the portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"dwangwk"},"content":" * 4b1. CapitalConnect notifies the user about the duplicate entry.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"dwangwk"},"content":"**Use case: Search for startup investments by industry \u0026 funding stage**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"dwangwk"},"content":"1. User requests to search for startup investments by industry and funding stage.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to input the industry and funding stage.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"dwangwk"},"content":"3. User provides the industry and funding stage.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect searches for startup investments matching the specified industry and funding stage in the user\u0027s portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"dwangwk"},"content":"6. CapitalConnect displays the startup investments matching the search criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"dwangwk"},"content":"* 6a. No startup investments match the search criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"dwangwk"},"content":" * 6a1. CapitalConnect shows an error message indicating no matches found.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"dwangwk"},"content":"**Use case: Search for startup investments by name**","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"dwangwk"},"content":"1. User requests to search for startup investments by name.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to input the name of the startup.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"dwangwk"},"content":"3. User provides the name of the startup.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect searches for startup investments matching the specified name in the user\u0027s portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"dwangwk"},"content":"6. CapitalConnect displays the startup investments matching the search criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"dwangwk"},"content":"* 6a. No startup investments match the provided name.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"dwangwk"},"content":" * 6a1. CapitalConnect shows an error message indicating no matches found.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"dwangwk"},"content":"**Use case: Save the current state of CapitalConnect dashboard**","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"dwangwk"},"content":"1. CapitalConnect automatically saves the state of the dashboard after every add and delete operation.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"dwangwk"},"content":"* 1a. Issue with saving the dashboard state.","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"dwangwk"},"content":" * 1a1. CapitalConnect shows an error message indicating the issue with saving the dashboard state.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"dwangwk"},"content":"**Use case: Delete a startup investment from the portfolio**","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"dwangwk"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"dwangwk"},"content":"1. User requests to delete a specific startup investment from their portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"dwangwk"},"content":"2. CapitalConnect dashboard prompts the user to input the index of the startup investment to be deleted.","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"dwangwk"},"content":"3. User provides the index of the startup investment.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"dwangwk"},"content":"4. CapitalConnect verifies the input for validity.","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"dwangwk"},"content":"5. CapitalConnect deletes the startup investment at the specified index from the user\u0027s portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"dwangwk"},"content":"6. CapitalConnect displays a confirmation message indicating successful deletion of the startup investment.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"dwangwk"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"dwangwk"},"content":"* 4a. Invalid input or missing parameters.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"dwangwk"},"content":" * 4a1. CapitalConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"dwangwk"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"dwangwk"},"content":"* 5a. Specified index is out of range or no startup investments at the specified index.","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"dwangwk"},"content":" * 5a1. CapitalConnect shows an error message indicating the issue.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"dwangwk"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"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":445,"author":{"gitId":"dwangwk"},"content":"2. Should be able to hold up to 1000 startups without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"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":447,"author":{"gitId":"dwangwk"},"content":"4. The system should have a response time of less than 1 second for common operations, such as adding or deleting a startup investment, to provide a smooth user experience.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"dwangwk"},"content":"5. The application should provide clear and user-friendly error messages in case of invalid input or system errors to assist users in troubleshooting issues efficiently.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"dwangwk"},"content":"6. The dashboard interface should be responsive and adapt to different screen sizes, ensuring a seamless user experience across devices such as desktops, laptops, tablets, and smartphones.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":455,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"dwangwk"},"content":"* **CapitalConnect dashboard**: The user interface of the CapitalConnect application where users can manage their startup investments, perform searches, and view their portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"dwangwk"},"content":"* **Startup investment**: An investment made by a user in a startup company, typically including details such as the startup name, industry, funding stage, address, and contact information.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"dwangwk"},"content":"* **Industry**: The sector or field in which a startup operates, such as Tech, Biotech, or Finance.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"dwangwk"},"content":"* **Funding stage**: The development stage of a startup at which it has received a certain level of investment, such as Seed, Series A, or Series B.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"dwangwk"},"content":"* **Dashboard state**: The current configuration and data displayed in the CapitalConnect dashboard, including startup investments and any applied filters or search results.","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"dwangwk"},"content":"* **Index**: A numeric value representing the position of an item within a list, used in commands to reference specific startup investments in the portfolio.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"dwangwk"},"content":"* **Confirmation message**: A notification displayed to the user indicating the successful completion of an action, such as adding or deleting a startup investment.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":472,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":473,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"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":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"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":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"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":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"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":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"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":507,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"dwangwk":126,"yespiggy":15,"-":376}},{"path":"docs/team/danielwang.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dwangwk"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"dwangwk"},"content":" title: \"Daniel Wang\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"dwangwk"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"dwangwk"},"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":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"dwangwk"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"dwangwk"},"content":"* **New Feature**: Added the ability to delete startups from the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"dwangwk"},"content":" * What it does: This allows users to delete startups from the Capital Connect data.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dwangwk"},"content":" * Justification: This is imperative for our users to upkeep the data with the latest information.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dwangwk"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"dwangwk"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"dwangwk"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"dwangwk"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"dwangwk"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"dwangwk"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"dwangwk"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"dwangwk"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"dwangwk"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"dwangwk"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"dwangwk"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"dwangwk"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"dwangwk"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"dwangwk"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"dwangwk"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":42}},{"path":"docs/team/natasya.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dwangwk"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"dwangwk"},"content":" title: \"Natasya\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"dwangwk"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"dwangwk"},"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":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"dwangwk"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"dwangwk"},"content":"* **New Feature**: Added the ability to delete startups from the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"dwangwk"},"content":" * What it does: This allows users to delete startups from the Capital Connect data.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dwangwk"},"content":" * Justification: This is imperative for our users to upkeep the data with the latest information.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dwangwk"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"dwangwk"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"dwangwk"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"dwangwk"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"dwangwk"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"dwangwk"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"dwangwk"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"dwangwk"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"dwangwk"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"dwangwk"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"dwangwk"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"dwangwk"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"dwangwk"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"dwangwk"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"dwangwk"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":42}},{"path":"docs/team/shuheng.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: \"John Doe\u0027s Project Portfolio Page\"","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":"### 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":"yeoshuheng"},"content":"* **New Feature**: Added the ability to add startups to the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" * What it does: This allows users to add startups to Capital Connect alongside information such as funding stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" * Justification: This is imperative for our users as they consist of key information they have to track.","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"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":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"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":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"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":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":41,"yeoshuheng":3}},{"path":"docs/team/sifan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"dwangwk"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"dwangwk"},"content":" title: \"Si Fan\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"dwangwk"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"dwangwk"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"dwangwk"},"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":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"dwangwk"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"dwangwk"},"content":"* **New Feature**: Added the ability to delete startups from the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"dwangwk"},"content":" * What it does: This allows users to delete startups from the Capital Connect data.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"dwangwk"},"content":" * Justification: This is imperative for our users to upkeep the data with the latest information.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"dwangwk"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"dwangwk"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"dwangwk"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"dwangwk"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"dwangwk"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"dwangwk"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"dwangwk"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"dwangwk"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"dwangwk"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"dwangwk"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"dwangwk"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"dwangwk"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"dwangwk"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"dwangwk"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"dwangwk"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"dwangwk"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"dwangwk"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"dwangwk"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"dwangwk"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"dwangwk"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"dwangwk"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"dwangwk":41}},{"path":"src/main/java/seedu/address/logic/Messages.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2023-07-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2023-07-14"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.Prefix;","lastModifiedDate":"2023-07-14"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2019-02-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Container for user visible messages.","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Messages {","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final String MESSAGE_UNKNOWN_COMMAND \u003d \"Unknown command\";","lastModifiedDate":"2016-09-21"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_COMMAND_FORMAT \u003d \"Invalid command format! \\n%1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX \u003d \"The person index provided is invalid\";","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String MESSAGE_PERSONS_LISTED_OVERVIEW \u003d \"%1$d persons listed!\";","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_FIELDS \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Multiple values specified for the following single-valued field(s): \";","lastModifiedDate":"2023-07-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2023-07-14"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Returns an error message indicating the duplicate prefixes.","lastModifiedDate":"2023-07-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2023-07-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePrefixes) {","lastModifiedDate":"2023-07-14"},{"lineNumber":26,"author":{"gitId":"-"},"content":" assert duplicatePrefixes.length \u003e 0;","lastModifiedDate":"2023-07-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":" Set\u003cString\u003e duplicateFields \u003d","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Stream.of(duplicatePrefixes).map(Prefix::toString).collect(Collectors.toSet());","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return MESSAGE_DUPLICATE_FIELDS + String.join(\" \", duplicateFields);","lastModifiedDate":"2023-07-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Formats the {@code person} for display to the user.","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static String format(Person person) {","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" final StringBuilder builder \u003d new StringBuilder();","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" builder.append(person.getName())","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" .append(\"; Industry: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" .append(person.getIndustry())","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" .append(\"; Funding Stage: \")","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" .append(person.getFundingStage())","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .append(\"; Tags: \");","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" person.getTags().forEach(builder::append);","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":51,"yeoshuheng":4}},{"path":"src/main/java/seedu/address/logic/commands/AddCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-09-22"},{"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.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-01-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Adds a person to the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Adds a person to the address book. \"","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + \"Parameters: \"","lastModifiedDate":"2017-06-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"NAME \"","lastModifiedDate":"2017-06-06"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" + PREFIX_INDUSTRY + \"INDUSTRY \"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" + PREFIX_FUNDING_STAGE + \"FUNDING STAGE \"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"PHONE \"","lastModifiedDate":"2017-05-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"EMAIL \"","lastModifiedDate":"2017-05-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" \"","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" + PREFIX_NAME + \"John Doe \"","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"98765432 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johnd@example.com \"","lastModifiedDate":"2017-05-09"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"friends \"","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + PREFIX_TAG + \"owesMoney\";","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_SUCCESS \u003d \"New person added: %1$s\";","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book\";","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private final Person toAdd;","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Creates an AddCommand to add the specified {@code Person}","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" requireNonNull(person);","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" toAdd \u003d person;","lastModifiedDate":"2018-01-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2017-05-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (model.hasPerson(toAdd)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" model.addPerson(toAdd);","lastModifiedDate":"2016-09-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd)));","lastModifiedDate":"2019-02-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-22"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return toAdd.equals(otherAddCommand.toAdd);","lastModifiedDate":"2023-07-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" .add(\"toAdd\", toAdd)","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":84,"yeoshuheng":4}},{"path":"src/main/java/seedu/address/logic/commands/EditCommand.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2016-12-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2018-01-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-01-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.CollectionUtil;","lastModifiedDate":"2016-12-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" + \"[\" + PREFIX_INDUSTRY + \"INDUSTRY\" + \"] \"","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" + \"[\" + PREFIX_FUNDING_STAGE + \"FUNDING STAGE] \"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_EDITED \u003d \"At least one field to edit must be provided.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":73,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":79,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":93,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":100,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" FundingStage updatedFundingStage \u003d editPersonDescriptor.getFundingStage().orElse(","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" personToEdit.getFundingStage());","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" Industry updatedIndustry \u003d editPersonDescriptor.getIndustry().orElse(personToEdit.getIndustry());","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":110,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" return new Person(updatedName, updatedFundingStage, updatedIndustry,","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":" updatedPhone, updatedEmail, updatedAddress, updatedTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":144,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":147,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" private Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"yeoshuheng"},"content":" private FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":153,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":154,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":155,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-06-21"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":162,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":163,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":164,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" setFundingStage(toCopy.fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":" setIndustry(toCopy.industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":168,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":169,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":170,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" return CollectionUtil.isAnyNonNull(name, industry, fundingStage, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":178,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":179,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":180,"author":{"gitId":"yeoshuheng"},"content":" public void setIndustry(Industry industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":181,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":182,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":183,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":184,"author":{"gitId":"yeoshuheng"},"content":" public void setFundingStage(FundingStage fundingStage) {","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":189,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":192,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":193,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" public Optional\u003cIndustry\u003e getIndustry() {","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" return Optional.ofNullable(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":199,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":200,"author":{"gitId":"yeoshuheng"},"content":" public Optional\u003cFundingStage\u003e getFundingStage() {","lastModifiedDate":"2024-02-25"},{"lineNumber":201,"author":{"gitId":"yeoshuheng"},"content":" return Optional.ofNullable(fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":204,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":205,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":206,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":208,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":209,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":212,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":213,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":216,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":217,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":218,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":220,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":221,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":222,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":224,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":225,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","lastModifiedDate":"2017-06-21"},{"lineNumber":226,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":228,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Sets {@code tags} to this object\u0027s {@code tags}.","lastModifiedDate":"2018-01-11"},{"lineNumber":230,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":231,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":232,"author":{"gitId":"-"},"content":" public void setTags(Set\u003cTag\u003e tags) {","lastModifiedDate":"2017-06-21"},{"lineNumber":233,"author":{"gitId":"-"},"content":" this.tags \u003d (tags !\u003d null) ? new HashSet\u003c\u003e(tags) : null;","lastModifiedDate":"2018-01-11"},{"lineNumber":234,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":236,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2018-01-11"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2018-01-11"},{"lineNumber":239,"author":{"gitId":"-"},"content":" * Returns {@code Optional#empty()} if {@code tags} is null.","lastModifiedDate":"2018-01-11"},{"lineNumber":240,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":241,"author":{"gitId":"-"},"content":" public Optional\u003cSet\u003cTag\u003e\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":242,"author":{"gitId":"-"},"content":" return (tags !\u003d null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();","lastModifiedDate":"2018-01-11"},{"lineNumber":243,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":246,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":247,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":248,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":249,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":251,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":252,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":253,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":256,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":257,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":258,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":259,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 Objects.equals(fundingStage, otherEditPersonDescriptor.fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":260,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 Objects.equals(industry, otherEditPersonDescriptor.industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":261,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":262,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":263,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":270,"author":{"gitId":"yeoshuheng"},"content":" .add(\"industry\", industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":271,"author":{"gitId":"yeoshuheng"},"content":" .add(\"funding stage\", fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":272,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":279,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"-":240,"yeoshuheng":39}},{"path":"src/main/java/seedu/address/logic/parser/AddCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-17"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-02-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME,","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_INDUSTRY, PREFIX_FUNDING_STAGE, PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_INDUSTRY,","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_FUNDING_STAGE, PREFIX_ADDRESS,","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" PREFIX_FUNDING_STAGE, PREFIX_INDUSTRY);","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" FundingStage fundingStage \u003d ParserUtil.parseFundingStage(argMultimap.getValue(PREFIX_FUNDING_STAGE).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" Industry industry \u003d ParserUtil.parseIndustry(argMultimap.getValue(PREFIX_INDUSTRY).get());","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagList \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" Person person \u003d new Person(name, fundingStage, industry, phone, email, address, tagList);","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":67,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":72,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"-":57,"yeoshuheng":15}},{"path":"src/main/java/seedu/address/logic/parser/CliSyntax.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Contains Command Line Interface (CLI) syntax definitions common to multiple commands","lastModifiedDate":"2017-02-11"},{"lineNumber":5,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class CliSyntax {","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":" /* Prefix definitions */","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_NAME \u003d new Prefix(\"n/\");","lastModifiedDate":"2017-06-06"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":" public static final Prefix PREFIX_INDUSTRY \u003d new Prefix(\"i/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final Prefix PREFIX_FUNDING_STAGE \u003d new Prefix(\"f/\");","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_PHONE \u003d new Prefix(\"p/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_EMAIL \u003d new Prefix(\"e/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":15,"yeoshuheng":2}},{"path":"src/main/java/seedu/address/logic/parser/EditCommandParser.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-01-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-01-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-01-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-26"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-01-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-01-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":29,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" ArgumentTokenizer.tokenize(args, CliSyntax.PREFIX_NAME,","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_INDUSTRY, CliSyntax.PREFIX_FUNDING_STAGE, CliSyntax.PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS, CliSyntax.PREFIX_TAG);","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":37,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(CliSyntax.PREFIX_NAME, CliSyntax.PREFIX_PHONE,","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_ADDRESS);","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_NAME).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(CliSyntax.PREFIX_NAME).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_FUNDING_STAGE).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setFundingStage(","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parseFundingStage(argMultimap.getValue(CliSyntax.PREFIX_FUNDING_STAGE).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_INDUSTRY).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setIndustry(","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parseIndustry(argMultimap.getValue(CliSyntax.PREFIX_INDUSTRY).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setPhone(","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" ParserUtil.parsePhone(argMultimap.getValue(CliSyntax.PREFIX_PHONE).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(CliSyntax.PREFIX_EMAIL).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" if (argMultimap.getValue(CliSyntax.PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" argMultimap.getValue(CliSyntax.PREFIX_ADDRESS).get()));","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" parseTagsForEdit(argMultimap.getAllValues(CliSyntax.PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2017-03-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2017-01-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2017-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private Optional\u003cSet\u003cTag\u003e\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2017-01-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2017-01-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2017-01-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2017-01-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"-":69,"yeoshuheng":24}},{"path":"src/main/java/seedu/address/logic/parser/ParserUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-02-11"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collection;","lastModifiedDate":"2017-02-11"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-02-11"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-02-11"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":27,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":33,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":35,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (!Name.isValidName(trimmedName)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":50,"author":{"gitId":"-"},"content":" throw new ParseException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" * Parses a {@code String industry} into a {@code Industry}.","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" * @throws ParseException if the given {@code industry} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" public static Industry parseIndustry(String industry) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" String trimmedIndustry \u003d industry.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" if (!Industry.isValidIndustry(trimmedIndustry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" throw new ParseException(Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" return new Industry(trimmedIndustry);","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" * Parses a {@code String fundingLevel} into a {@code FundingStage}.","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" *","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":" * @throws ParseException if the given {@code fundingStage} is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"yeoshuheng"},"content":" public static FundingStage parseFundingStage(String fundingLevel) throws ParseException {","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" String trimmedFundingLevel \u003d fundingLevel.trim();","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" if (!FundingStage.isValidFundingLevel(fundingLevel)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" throw new ParseException(FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"yeoshuheng"},"content":" return new FundingStage(trimmedFundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":89,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(trimmedPhone)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":96,"author":{"gitId":"-"},"content":" throw new ParseException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":104,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":109,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":110,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(trimmedAddress)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":111,"author":{"gitId":"-"},"content":" throw new ParseException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":116,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" * Parses a {@code String email} into an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":119,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code email} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":121,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" public static Email parseEmail(String email) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":123,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" String trimmedEmail \u003d email.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":125,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(trimmedEmail)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":126,"author":{"gitId":"-"},"content":" throw new ParseException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":131,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * Parses a {@code String tag} into a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":134,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code tag} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":136,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public static Tag parseTag(String tag) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":138,"author":{"gitId":"-"},"content":" requireNonNull(tag);","lastModifiedDate":"2017-05-30"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String trimmedTag \u003d tag.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" if (!Tag.isValidTagName(trimmedTag)) {","lastModifiedDate":"2017-05-30"},{"lineNumber":141,"author":{"gitId":"-"},"content":" throw new ParseException(Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":" return new Tag(trimmedTag);","lastModifiedDate":"2017-05-30"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e}.","lastModifiedDate":"2017-03-07"},{"lineNumber":148,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":149,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":150,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e tagSet \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2017-02-11"},{"lineNumber":152,"author":{"gitId":"-"},"content":" for (String tagName : tags) {","lastModifiedDate":"2017-02-11"},{"lineNumber":153,"author":{"gitId":"-"},"content":" tagSet.add(parseTag(tagName));","lastModifiedDate":"2017-05-30"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":155,"author":{"gitId":"-"},"content":" return tagSet;","lastModifiedDate":"2017-03-07"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":157,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"-":124,"yeoshuheng":33}},{"path":"src/main/java/seedu/address/model/person/FundingStage.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"/**","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":" * Represents funding stage of current project.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class FundingStage {","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" \"Funding stages should be either \u0027A\u0027, \u0027B\u0027 or \u0027C\u0027.\";","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" public final String value;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" * Constructor for a funding stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" * @param fundingLevel The funding level (A, B, C) of the current stage.","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" public FundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" fundingLevel \u003d fundingLevel.toUpperCase();","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" checkArgument(isValidFundingLevel(fundingLevel), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" value \u003d fundingLevel;","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" * Returns true if a given industry is a valid industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" public static boolean isValidFundingLevel(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" return fundingLevel.equals(\"A\") || fundingLevel.equals(\"B\") || fundingLevel.equals(\"C\");","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" return true;","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" if (!(other instanceof FundingStage)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" FundingStage otherFundingStage \u003d (FundingStage) other;","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" return value.equals(otherFundingStage.value);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" public String toString() {","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" return this.value;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"yeoshuheng":53}},{"path":"src/main/java/seedu/address/model/person/Industry.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"/**","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":" * Represents industry person is from.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class Industry {","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" \"Industry names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" /*","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" public final String value;","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" * Constructor for an industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" * @param industry Name of the industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" public Industry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" requireNonNull(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" checkArgument(isValidIndustry(industry), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" value \u003d industry.toUpperCase();","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" * Returns true if a given industry is a valid industry.","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public static boolean isValidIndustry(String test) {","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" public String toString() {","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" return this.value;","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" @Override","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" return true;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" if (!(other instanceof Industry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" return false;","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" Industry otherIndustry \u003d (Industry) other;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" return value.equals(otherIndustry.value);","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"yeoshuheng":58}},{"path":"src/main/java/seedu/address/model/person/Person.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 seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2017-05-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-03-26"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" private final FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" private final Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private final Set\u003cTag\u003e tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" public Person(Name name, FundingStage fundingStage, Industry industry,","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" Phone phone, Email email, Address address, Set\u003cTag\u003e tags) {","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" requireAllNonNull(name, fundingStage, industry, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" public FundingStage getFundingStage() {","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" return this.fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" public Industry getIndustry() {","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" return this.industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public Name getName() {","lastModifiedDate":"2017-07-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return name;","lastModifiedDate":"2017-12-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public Phone getPhone() {","lastModifiedDate":"2017-07-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public Email getEmail() {","lastModifiedDate":"2017-07-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return email;","lastModifiedDate":"2017-12-20"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public Address getAddress() {","lastModifiedDate":"2017-07-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":" return address;","lastModifiedDate":"2017-12-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-12"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Returns an immutable tag set, which throws {@code UnsupportedOperationException}","lastModifiedDate":"2017-03-07"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * if modification is attempted.","lastModifiedDate":"2017-03-07"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public Set\u003cTag\u003e getTags() {","lastModifiedDate":"2017-03-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Collections.unmodifiableSet(tags);","lastModifiedDate":"2018-03-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":100,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":104,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 industry.equals(otherPerson.industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" \u0026\u0026 fundingStage.equals(otherPerson.fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" \u0026\u0026 address.equals(otherPerson.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" \u0026\u0026 tags.equals(otherPerson.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":120,"author":{"gitId":"-"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2016-08-24"},{"lineNumber":121,"author":{"gitId":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":124,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":125,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"yeoshuheng"},"content":" .add(\"industry\", industry)","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"yeoshuheng"},"content":" .add(\"funding stage\", fundingStage)","lastModifiedDate":"2024-02-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"-":115,"yeoshuheng":22}},{"path":"src/main/java/seedu/address/model/util/SampleDataUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.util;","lastModifiedDate":"2016-12-20"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2018-01-21"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-01-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-03-14"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Alex Yeoh\"), new FundingStage(\"A\"), new Industry(\"Finance\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Bernice Yu\"), new FundingStage(\"B\"), new Industry(\"GreenTech\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new FundingStage(\"C\"), new Industry(\"Health\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"David Li\"), new FundingStage(\"A\"), new Industry(\"Manufacturing\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new FundingStage(\"C\"), new Industry(\"Tech\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":43,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new FundingStage(\"A\"), new Industry(\"Food\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":47,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":52,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":54,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public static Set\u003cTag\u003e getTagSet(String... strings) {","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return Arrays.stream(strings)","lastModifiedDate":"2018-01-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" .map(Tag::new)","lastModifiedDate":"2018-01-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .collect(Collectors.toSet());","lastModifiedDate":"2018-01-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"-":54,"yeoshuheng":14}},{"path":"src/main/java/seedu/address/storage/JsonAdaptedPerson.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Jackson-friendly version of {@link Person}.","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":"class JsonAdaptedPerson {","lastModifiedDate":"2018-12-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String MISSING_FIELD_MESSAGE_FORMAT \u003d \"Person\u0027s %s field is missing!\";","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String name;","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" private final String industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" private final String fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private final String phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private final String email;","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private final String address;","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private final List\u003cJsonAdaptedTag\u003e tags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2023-01-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Constructs a {@code JsonAdaptedPerson} with the given person details.","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @JsonCreator","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" public JsonAdaptedPerson(@JsonProperty(\"name\") String name, @JsonProperty(\"industry\") String industry,","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" @JsonProperty(\"fundingStage\") String fundingStage, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" @JsonProperty(\"tags\") List\u003cJsonAdaptedTag\u003e tags) {","lastModifiedDate":"2023-05-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2018-08-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (tags !\u003d null) {","lastModifiedDate":"2023-01-09"},{"lineNumber":55,"author":{"gitId":"-"},"content":" this.tags.addAll(tags);","lastModifiedDate":"2023-01-09"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Converts a given {@code Person} into this class for Jackson use.","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public JsonAdaptedPerson(Person source) {","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" name \u003d source.getName().fullName;","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" phone \u003d source.getPhone().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" email \u003d source.getEmail().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" address \u003d source.getAddress().value;","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d source.getIndustry().value;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d source.getFundingStage().value;","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" tags.addAll(source.getTags().stream()","lastModifiedDate":"2023-01-09"},{"lineNumber":70,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Converts this Jackson-friendly adapted person object into the model\u0027s {@code Person} object.","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * @throws IllegalValueException if there were any data constraints violated in the adapted person.","lastModifiedDate":"2018-08-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public Person toModelType() throws IllegalValueException {","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" final List\u003cTag\u003e personTags \u003d new ArrayList\u003c\u003e();","lastModifiedDate":"2018-08-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" for (JsonAdaptedTag tag : tags) {","lastModifiedDate":"2023-01-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" personTags.add(tag.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (name \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":88,"author":{"gitId":"-"},"content":" if (!Name.isValidName(name)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":" final Name modelName \u003d new Name(name);","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"yeoshuheng"},"content":" if (industry \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" Industry.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"yeoshuheng"},"content":" if (!Industry.isValidIndustry(industry)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"yeoshuheng"},"content":" final Industry modelIndustry \u003d new Industry(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"yeoshuheng"},"content":" if (fundingStage \u003d\u003d null) {","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT,","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" FundingStage.class.getSimpleName()));","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" if (!FundingStage.isValidFundingLevel(fundingStage)) {","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" throw new IllegalValueException(FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" final FundingStage modelFundingStage \u003d new FundingStage(fundingStage);","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (phone \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":112,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (!Phone.isValidPhone(phone)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" final Phone modelPhone \u003d new Phone(phone);","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (email \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" if (!Email.isValidEmail(email)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" final Email modelEmail \u003d new Email(email);","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" if (address \u003d\u003d null) {","lastModifiedDate":"2018-08-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":" throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));","lastModifiedDate":"2018-08-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":130,"author":{"gitId":"-"},"content":" if (!Address.isValidAddress(address)) {","lastModifiedDate":"2018-08-13"},{"lineNumber":131,"author":{"gitId":"-"},"content":" throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-08-13"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":133,"author":{"gitId":"-"},"content":" final Address modelAddress \u003d new Address(address);","lastModifiedDate":"2018-08-13"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":135,"author":{"gitId":"-"},"content":" final Set\u003cTag\u003e modelTags \u003d new HashSet\u003c\u003e(personTags);","lastModifiedDate":"2018-08-13"},{"lineNumber":136,"author":{"gitId":"yeoshuheng"},"content":" return new Person(modelName, modelFundingStage, modelIndustry, modelPhone, modelEmail, modelAddress, modelTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":139,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":107,"yeoshuheng":32}},{"path":"src/test/java/seedu/address/logic/LogicManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic;","lastModifiedDate":"2016-09-21"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX;","lastModifiedDate":"2023-07-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_UNKNOWN_COMMAND;","lastModifiedDate":"2023-07-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2018-12-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.CommandResult;","lastModifiedDate":"2017-01-18"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ListCommand;","lastModifiedDate":"2017-06-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2016-09-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2016-09-21"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-12-09"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-12-09"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonAddressBookStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonUserPrefsStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.storage.StorageManager;","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"addressBook.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":49,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":60,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String listCommand \u003d ListCommand.COMMAND_WORD;","lastModifiedDate":"2017-06-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2017-06-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":70,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":76,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":79,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":94,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":101,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":112,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":127,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":137,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":140,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":141,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":142,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":146,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":149,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":150,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":153,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":156,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":159,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":160,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" String addCommand \u003d AddCommand.COMMAND_WORD + CommandTestUtil.FUNDING_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_AMY + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":170,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":173,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"-":169,"yeoshuheng":4}},{"path":"src/test/java/seedu/address/logic/commands/CommandTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-06-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.parser.CliSyntax;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_INDUSTRY_BOB \u003d \"Finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_INDUSTRY_AMY \u003d \"Finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_FUNDING_BOB \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" public static final String VALID_FUNDING_AMY \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" public static final String INDUSTRY_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + VALID_INDUSTRY_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" public static final String INDUSTRY_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + VALID_INDUSTRY_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":" public static final String FUNDING_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + VALID_FUNDING_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" public static final String FUNDING_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + VALID_FUNDING_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + CliSyntax.PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + CliSyntax.PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_NAME_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_NAME + \"James\u0026\"; // \u0027\u0026\u0027 not allowed in names","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_PHONE_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_PHONE + \"911a\"; // \u0027a\u0027 not allowed in phones","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_TAG_DESC \u003d \" \"","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" + CliSyntax.PREFIX_TAG + \"hubby*\"; // \u0027*\u0027 not allowed in tags","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_INDUSTRY_DESC \u003d \" \" + CliSyntax.PREFIX_INDUSTRY + \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" public static final String INVALID_FUNDING_DESC \u003d \" \" + CliSyntax.PREFIX_FUNDING_STAGE + \"D\";","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":" .withTags(VALID_TAG_FRIEND).withIndustry(VALID_INDUSTRY_AMY)","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" .withFundingStage(VALID_FUNDING_AMY).build();","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" .withFundingStage(VALID_FUNDING_BOB).withIndustry(VALID_INDUSTRY_BOB)","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":99,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":100,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":102,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":104,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":109,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":111,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":114,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":118,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":120,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":125,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":127,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":128,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":134,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * Updates {@code model}\u0027s filtered list to show only the person at the given {@code targetIndex} in the","lastModifiedDate":"2018-01-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" final String[] splitName \u003d person.getName().fullName.split(\"\\\\s+\");","lastModifiedDate":"2017-07-20"},{"lineNumber":143,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":145,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"-":107,"yeoshuheng":41}},{"path":"src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorTest {","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptorWithSameValues \u003d new EditPersonDescriptor(DESC_AMY);","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(descriptorWithSameValues));","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertTrue(DESC_AMY.equals(DESC_AMY));","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(null));","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(5));","lastModifiedDate":"2017-05-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(DESC_BOB));","lastModifiedDate":"2017-05-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" EditPersonDescriptor editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2017-05-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":" editedAmy \u003d new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2017-05-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" assertFalse(DESC_AMY.equals(editedAmy));","lastModifiedDate":"2017-05-05"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2019-02-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String expected \u003d EditPersonDescriptor.class.getCanonicalName() + \"{name\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getName().orElse(null) + \", industry\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getIndustry().orElse(null) + \", funding stage\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" + editPersonDescriptor.getFundingStage().orElse(null) + \", phone\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getPhone().orElse(null) + \", email\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getEmail().orElse(null) + \", address\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getAddress().orElse(null) + \", tags\u003d\"","lastModifiedDate":"2019-02-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":" + editPersonDescriptor.getTags().orElse(null) + \"}\";","lastModifiedDate":"2019-02-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertEquals(expected, editPersonDescriptor.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":70,"yeoshuheng":3}},{"path":"src/test/java/seedu/address/logic/parser/AddCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-06-15"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-07-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-06-15"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-06-15"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-06-15"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-06-15"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-06-15"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-06-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-06-15"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2017-06-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withTags(CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, CommandTestUtil.PREAMBLE_WHITESPACE","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // multiple tags - all accepted","lastModifiedDate":"2017-06-15"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).withTags(","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_TAG_FRIEND, CommandTestUtil.VALID_TAG_HUSBAND)","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2023-07-14"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" String validExpectedPersonString \u003d CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB + CommandTestUtil.FUNDING_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" // multiple funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.FUNDING_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" // multiple industry","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INDUSTRY_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" validExpectedPersonString + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.NAME_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME,","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"yeoshuheng"},"content":" CliSyntax.PREFIX_ADDRESS, CliSyntax.PREFIX_EMAIL, CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_INDUSTRY_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_FUNDING_DESC + validExpectedPersonString,","lastModifiedDate":"2024-03-05"},{"lineNumber":115,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" // valid value followed by invalid value","lastModifiedDate":"2023-07-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_NAME_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_NAME));","lastModifiedDate":"2024-03-05"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_EMAIL_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_EMAIL));","lastModifiedDate":"2024-03-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":127,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":128,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_PHONE_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_PHONE));","lastModifiedDate":"2024-03-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":131,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":132,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_ADDRESS));","lastModifiedDate":"2024-03-05"},{"lineNumber":134,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":135,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":136,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_INDUSTRY_DESC,","lastModifiedDate":"2024-03-05"},{"lineNumber":137,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_INDUSTRY));","lastModifiedDate":"2024-03-05"},{"lineNumber":138,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":139,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":140,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, validExpectedPersonString + CommandTestUtil.INVALID_FUNDING_DESC,","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"yeoshuheng"},"content":" Messages.getErrorMessageForDuplicatePrefixes(CliSyntax.PREFIX_FUNDING_STAGE));","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":146,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, CommandTestUtil.NAME_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_AMY + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY,","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"-"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":155,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":157,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-06-15"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":161,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":162,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":163,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":164,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":169,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_PHONE_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":170,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":173,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":174,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":175,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":176,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.VALID_EMAIL_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":178,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":180,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":181,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":182,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":183,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":184,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":187,"author":{"gitId":"yeoshuheng"},"content":" // missing industry prefix","lastModifiedDate":"2024-03-05"},{"lineNumber":188,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":189,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"yeoshuheng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-05"},{"lineNumber":193,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":194,"author":{"gitId":"yeoshuheng"},"content":" // missing funding stage prefix","lastModifiedDate":"2024-03-05"},{"lineNumber":195,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-03-05"},{"lineNumber":199,"author":{"gitId":"yeoshuheng"},"content":" expectedMessage);","lastModifiedDate":"2024-03-05"},{"lineNumber":200,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":201,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":204,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_PHONE_BOB + CommandTestUtil.VALID_EMAIL_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":205,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_BOB,","lastModifiedDate":"2024-02-25"},{"lineNumber":206,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":209,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":210,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":211,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":212,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":213,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":214,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":215,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":216,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":217,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":219,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":220,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":221,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":222,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":224,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":225,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":227,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":228,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":229,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":230,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":231,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":232,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":233,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":235,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":236,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":237,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":238,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":239,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":240,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-02-25"},{"lineNumber":241,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":243,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":244,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":245,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":246,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.INVALID_FUNDING_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":247,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":248,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":249,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, FundingStage.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":250,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":251,"author":{"gitId":"yeoshuheng"},"content":" // invalid industry","lastModifiedDate":"2024-03-05"},{"lineNumber":252,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":253,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":254,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":255,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INVALID_INDUSTRY_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":256,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":257,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND, Industry.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":258,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":260,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2017-06-15"},{"lineNumber":261,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.NAME_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":262,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":263,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":264,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":265,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_TAG_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":266,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-02-25"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":268,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":269,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.INVALID_NAME_DESC","lastModifiedDate":"2024-02-25"},{"lineNumber":270,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":271,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":272,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.INVALID_ADDRESS_DESC,","lastModifiedDate":"2024-02-25"},{"lineNumber":273,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":276,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.PREAMBLE_NON_EMPTY","lastModifiedDate":"2024-02-25"},{"lineNumber":277,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_BOB + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":278,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":279,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.FUNDING_DESC_BOB + CommandTestUtil.INDUSTRY_DESC_BOB","lastModifiedDate":"2024-02-25"},{"lineNumber":280,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND + CommandTestUtil.TAG_DESC_FRIEND,","lastModifiedDate":"2024-02-25"},{"lineNumber":281,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-12-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":283,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"-":117,"yeoshuheng":166}},{"path":"src/test/java/seedu/address/logic/parser/EditCommandParserTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;","lastModifiedDate":"2023-07-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalIndexes.INDEX_THIRD_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.logic.commands.CommandTestUtil;","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-05-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2017-05-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2017-05-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2017-05-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2017-05-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-05-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String TAG_EMPTY \u003d \" \" + PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-05-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2017-05-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, CommandTestUtil.VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-07-06"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void parse_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"-5\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"0\" + CommandTestUtil.NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1 x/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name","lastModifiedDate":"2024-03-05"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone","lastModifiedDate":"2024-03-05"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":71,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":82,"author":{"gitId":"-"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2017-05-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2017-05-04"},{"lineNumber":84,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":85,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" + TAG_EMPTY, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"yeoshuheng"},"content":" + TAG_EMPTY + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\" + TAG_EMPTY","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" assertParseFailure(parser, \"1\"","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_NAME_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.VALID_ADDRESS_AMY + CommandTestUtil.VALID_PHONE_AMY,","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Name.MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void parse_allFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_SECOND_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_HUSBAND","lastModifiedDate":"2024-03-05"},{"lineNumber":105,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_AMY + CommandTestUtil.ADDRESS_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":106,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.NAME_DESC_AMY + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-05"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(CommandTestUtil.VALID_NAME_AMY)","lastModifiedDate":"2024-03-05"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" .withPhone(CommandTestUtil.VALID_PHONE_BOB).withEmail(","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_EMAIL_AMY).withAddress(CommandTestUtil.VALID_ADDRESS_AMY)","lastModifiedDate":"2024-03-05"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" .withTags(CommandTestUtil.VALID_TAG_HUSBAND, CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(CommandTestUtil.VALID_PHONE_BOB)","lastModifiedDate":"2024-03-05"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":130,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":131,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":133,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased() + CommandTestUtil.NAME_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":134,"author":{"gitId":"yeoshuheng"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(","lastModifiedDate":"2024-03-05"},{"lineNumber":135,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_NAME_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":136,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":137,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":139,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":140,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_PHONE_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":143,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":146,"author":{"gitId":"-"},"content":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":147,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.EMAIL_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":148,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(","lastModifiedDate":"2024-03-05"},{"lineNumber":149,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_EMAIL_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":153,"author":{"gitId":"-"},"content":" // address","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.ADDRESS_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":155,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(","lastModifiedDate":"2024-03-05"},{"lineNumber":156,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_ADDRESS_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":157,"author":{"gitId":"yeoshuheng"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-05"},{"lineNumber":158,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-05"},{"lineNumber":159,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":160,"author":{"gitId":"yeoshuheng"},"content":" // industry","lastModifiedDate":"2024-03-05"},{"lineNumber":161,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INDUSTRY_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":162,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withIndustry(","lastModifiedDate":"2024-03-05"},{"lineNumber":163,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_INDUSTRY_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":164,"author":{"gitId":"yeoshuheng"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2024-03-05"},{"lineNumber":165,"author":{"gitId":"yeoshuheng"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2024-03-05"},{"lineNumber":166,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":167,"author":{"gitId":"yeoshuheng"},"content":" // funding stage","lastModifiedDate":"2024-03-05"},{"lineNumber":168,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.FUNDING_DESC_AMY;","lastModifiedDate":"2024-03-05"},{"lineNumber":169,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withFundingStage(","lastModifiedDate":"2024-03-05"},{"lineNumber":170,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_FUNDING_AMY).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":172,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // tags","lastModifiedDate":"2017-05-04"},{"lineNumber":175,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2024-03-05"},{"lineNumber":176,"author":{"gitId":"yeoshuheng"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(","lastModifiedDate":"2024-03-05"},{"lineNumber":177,"author":{"gitId":"yeoshuheng"},"content":" CommandTestUtil.VALID_TAG_FRIEND).build();","lastModifiedDate":"2024-03-05"},{"lineNumber":178,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":180,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":182,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":183,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":184,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":185,"author":{"gitId":"-"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2023-07-14"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":187,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":188,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":189,"author":{"gitId":"yeoshuheng"},"content":" String userInput \u003d targetIndex.getOneBased()","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":193,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":195,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":196,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC;","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":199,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":201,"author":{"gitId":"-"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":202,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":203,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":204,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND + CommandTestUtil.PHONE_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":205,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.ADDRESS_DESC_AMY + CommandTestUtil.EMAIL_DESC_AMY","lastModifiedDate":"2024-03-05"},{"lineNumber":206,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.TAG_DESC_FRIEND","lastModifiedDate":"2024-03-05"},{"lineNumber":207,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.PHONE_DESC_BOB + CommandTestUtil.ADDRESS_DESC_BOB","lastModifiedDate":"2024-03-05"},{"lineNumber":208,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.EMAIL_DESC_BOB + CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2024-03-05"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":210,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":211,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":213,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":214,"author":{"gitId":"yeoshuheng"},"content":" userInput \u003d targetIndex.getOneBased() + CommandTestUtil.INVALID_PHONE_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":215,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_ADDRESS_DESC + CommandTestUtil.INVALID_EMAIL_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":216,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_PHONE_DESC + CommandTestUtil.INVALID_ADDRESS_DESC","lastModifiedDate":"2024-03-05"},{"lineNumber":217,"author":{"gitId":"yeoshuheng"},"content":" + CommandTestUtil.INVALID_EMAIL_DESC;","lastModifiedDate":"2024-03-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":219,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":220,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":221,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":223,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":224,"author":{"gitId":"-"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":225,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":226,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2017-05-25"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":228,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2017-05-04"},{"lineNumber":229,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":231,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":232,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":233,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"-":147,"yeoshuheng":86}},{"path":"src/test/java/seedu/address/model/person/FundingStageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class FundingStageTest {","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e new FundingStage(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_invalidFundingStage_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" String invalidPhone \u003d \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new FundingStage(invalidPhone));","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" public void isValidFundingStage() {","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" // null funding","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e FundingStage.isValidFundingLevel(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" // invalid funding levels","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"\")); // empty string","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\" \")); // spaces only","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"AB\")); // invalid funding level","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"1\")); // numbers","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(FundingStage.isValidFundingLevel(\"D\")); // invalid funding level","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" // valid funding levels","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"A\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"B\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(FundingStage.isValidFundingLevel(\"C\"));","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" public void equals() {","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" FundingStage fundingStage \u003d new FundingStage(\"A\");","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(fundingStage.equals(new FundingStage(\"A\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(fundingStage.equals(fundingStage));","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(5.0f));","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(fundingStage.equals(new FundingStage(\"B\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"yeoshuheng":59}},{"path":"src/test/java/seedu/address/model/person/IndustryTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"yeoshuheng"},"content":"package seedu.address.model.person;","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"yeoshuheng"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"yeoshuheng"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"public class IndustryTest {","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e new Industry(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"yeoshuheng"},"content":" public void constructor_invalidIndustry_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"yeoshuheng"},"content":" String invalidName \u003d \"\";","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Industry(invalidName));","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"yeoshuheng"},"content":" public void isValidIndustry() {","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"yeoshuheng"},"content":" assertThrows(NullPointerException.class, () -\u003e Industry.isValidIndustry(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"\")); // empty string","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\" \")); // spaces only","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(Industry.isValidIndustry(\"finance*\")); // contains non-alphanumeric characters","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"Finance\")); // alphabets only","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"MANUFACTURING\")); // all capital","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(Industry.isValidIndustry(\"web 3\")); // with numbers","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":" @Test","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" public void equals() {","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" Industry industry \u003d new Industry(\"Valid Industry\");","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" // same values -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(industry.equals(new Industry(\"Valid Industry\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" // same object -\u003e returns true","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" assertTrue(industry.equals(industry));","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" // null -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(null));","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" // different types -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(5.0f));","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"yeoshuheng"},"content":" // different values -\u003e returns false","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"yeoshuheng"},"content":" assertFalse(industry.equals(new Industry(\"Other Valid Industry\")));","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":"}","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"yeoshuheng":53}},{"path":"src/test/java/seedu/address/model/person/PersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2018-03-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-02-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertFalse;","lastModifiedDate":"2019-03-15"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertTrue;","lastModifiedDate":"2019-03-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2018-04-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.ALICE;","lastModifiedDate":"2018-04-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-04-19"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-03-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonTest {","lastModifiedDate":"2018-03-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public void asObservableList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" Person person \u003d new PersonBuilder().build();","lastModifiedDate":"2018-03-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e person.getTags().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public void isSamePerson() {","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":35,"author":{"gitId":"-"},"content":" // same name, all other attributes different -\u003e returns true","lastModifiedDate":"2020-12-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)","lastModifiedDate":"2020-12-18"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertTrue(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2020-12-18"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" // different name, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":41,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertFalse(ALICE.isSamePerson(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // name differs in case, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Person editedBob \u003d new PersonBuilder(BOB).withName(VALID_NAME_BOB.toLowerCase()).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // name has trailing spaces, all other attributes same -\u003e returns false","lastModifiedDate":"2020-12-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String nameWithTrailingSpaces \u003d VALID_NAME_BOB + \" \";","lastModifiedDate":"2020-12-18"},{"lineNumber":50,"author":{"gitId":"-"},"content":" editedBob \u003d new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build();","lastModifiedDate":"2020-12-18"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(BOB.isSamePerson(editedBob));","lastModifiedDate":"2020-12-18"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-04-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2018-04-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Person aliceCopy \u003d new PersonBuilder(ALICE).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(aliceCopy));","lastModifiedDate":"2018-04-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2018-04-19"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertTrue(ALICE.equals(ALICE));","lastModifiedDate":"2018-04-19"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":63,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(null));","lastModifiedDate":"2018-04-19"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // different type -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(5));","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // different person -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(BOB));","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // different name -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" Person editedAlice \u003d new PersonBuilder(ALICE).withName(VALID_NAME_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // different phone -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // different email -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // different address -\u003e returns false","lastModifiedDate":"2018-04-19"},{"lineNumber":85,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build();","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-19"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-18"},{"lineNumber":88,"author":{"gitId":"-"},"content":" // different tags -\u003e returns false","lastModifiedDate":"2018-04-18"},{"lineNumber":89,"author":{"gitId":"-"},"content":" editedAlice \u003d new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();","lastModifiedDate":"2018-04-18"},{"lineNumber":90,"author":{"gitId":"-"},"content":" assertFalse(ALICE.equals(editedAlice));","lastModifiedDate":"2018-04-18"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void toStringMethod() {","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" String expected \u003d Person.class.getCanonicalName() + \"{name\u003d\" + ALICE.getName()","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"yeoshuheng"},"content":" + \", industry\u003d\" + ALICE.getIndustry() + \", funding stage\u003d\" + ALICE.getFundingStage()","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"yeoshuheng"},"content":" + \", phone\u003d\" + ALICE.getPhone()","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"yeoshuheng"},"content":" + \", email\u003d\" + ALICE.getEmail() + \", address\u003d\" + ALICE.getAddress() + \", tags\u003d\"","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"yeoshuheng"},"content":" + ALICE.getTags() + \"}\";","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expected, ALICE.toString());","lastModifiedDate":"2019-02-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-09-01"}],"authorContributionMap":{"-":97,"yeoshuheng":5}},{"path":"src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2018-08-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.storage.JsonAdaptedPerson.MISSING_FIELD_MESSAGE_FORMAT;","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.IllegalValueException;","lastModifiedDate":"2018-08-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAdaptedPersonTest {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2018-08-13"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":" private static final String INVALID_FUNDING \u003d \"D\";","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":" private static final String INVALID_INDUSTRY \u003d \" \";","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d BENSON.getName().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d BENSON.getPhone().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d BENSON.getEmail().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d BENSON.getAddress().toString();","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" private static final String VALID_FUNDING \u003d BENSON.getFundingStage().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" private static final String VALID_INDUSTRY \u003d BENSON.getIndustry().toString();","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final List\u003cJsonAdaptedTag\u003e VALID_TAGS \u003d BENSON.getTags().stream()","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .map(JsonAdaptedTag::new)","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public void toModelType_validPersonDetails_returnsPerson() throws Exception {","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(BENSON);","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertEquals(BENSON, person.toModelType());","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public void toModelType_invalidName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(INVALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Name.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void toModelType_nullName_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(null, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void toModelType_invalidPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"yeoshuheng"},"content":" INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Phone.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void toModelType_nullPhone_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":77,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"yeoshuheng"},"content":" null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":84,"author":{"gitId":"-"},"content":" public void toModelType_invalidEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":85,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":86,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Email.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":92,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public void toModelType_nullEmail_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":94,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void toModelType_invalidAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":102,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":103,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String expectedMessage \u003d Address.MESSAGE_CONSTRAINTS;","lastModifiedDate":"2018-08-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":109,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void toModelType_nullAddress_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" JsonAdaptedPerson person \u003d new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());","lastModifiedDate":"2018-08-13"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public void toModelType_invalidTags_throwsIllegalValueException() {","lastModifiedDate":"2018-08-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" List\u003cJsonAdaptedTag\u003e invalidTags \u003d new ArrayList\u003c\u003e(VALID_TAGS);","lastModifiedDate":"2018-08-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" invalidTags.add(new JsonAdaptedTag(INVALID_TAG));","lastModifiedDate":"2018-08-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":" JsonAdaptedPerson person \u003d","lastModifiedDate":"2018-08-13"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":" new JsonAdaptedPerson(VALID_NAME, VALID_INDUSTRY, VALID_FUNDING,","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":" VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":" assertThrows(IllegalValueException.class, person::toModelType);","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"-":101,"yeoshuheng":26}},{"path":"src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-05-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-12-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2017-12-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-12-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-12-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","lastModifiedDate":"2017-05-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":36,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setIndustry(person.getIndustry());","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setFundingStage(person.getFundingStage());","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code FundingStage} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"yeoshuheng"},"content":" public EditPersonDescriptorBuilder withFundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setFundingStage(new FundingStage(fundingLevel));","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code Industry} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"yeoshuheng"},"content":" public EditPersonDescriptorBuilder withIndustry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"yeoshuheng"},"content":" descriptor.setIndustry(new Industry(industry));","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":74,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","lastModifiedDate":"2017-12-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":80,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":94,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code EditPersonDescriptor}","lastModifiedDate":"2017-07-26"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":97,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tagSet \u003d Stream.of(tags).map(Tag::new).collect(Collectors.toSet());","lastModifiedDate":"2017-12-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":" descriptor.setTags(tagSet);","lastModifiedDate":"2017-12-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"-":87,"yeoshuheng":20}},{"path":"src/test/java/seedu/address/testutil/PersonBuilder.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.HashSet;","lastModifiedDate":"2017-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2017-04-05"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Address;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Email;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.FundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"yeoshuheng"},"content":"import seedu.address.model.person.Industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Name;","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Phone;","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-04-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.util.SampleDataUtil;","lastModifiedDate":"2017-04-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"yeoshuheng"},"content":" public static final String DEFAULT_INDUSTRY \u003d \"finance\";","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" public static final String DEFAULT_FUNDING \u003d \"A\";","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":32,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"yeoshuheng"},"content":" private Industry industry;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" private FundingStage fundingStage;","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private Set\u003cTag\u003e tags;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":45,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d new Industry(DEFAULT_INDUSTRY);","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d new FundingStage(DEFAULT_FUNDING);","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":49,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":50,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":51,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e();","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":59,"author":{"gitId":"yeoshuheng"},"content":" industry \u003d personToCopy.getIndustry();","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"yeoshuheng"},"content":" fundingStage \u003d personToCopy.getFundingStage();","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":62,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":63,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":64,"author":{"gitId":"-"},"content":" tags \u003d new HashSet\u003c\u003e(personToCopy.getTags());","lastModifiedDate":"2017-12-20"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":71,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Parses the {@code tags} into a {@code Set\u003cTag\u003e} and set it to the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String ... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":95,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":99,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":107,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code fundingStage} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"yeoshuheng"},"content":" public PersonBuilder withFundingStage(String fundingLevel) {","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"yeoshuheng"},"content":" this.fundingStage \u003d new FundingStage(fundingLevel);","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"yeoshuheng"},"content":" /**","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"yeoshuheng"},"content":" * Sets the {@code industry} of the {@code Person} that we are building.","lastModifiedDate":"2024-02-25"},{"lineNumber":117,"author":{"gitId":"yeoshuheng"},"content":" */","lastModifiedDate":"2024-02-25"},{"lineNumber":118,"author":{"gitId":"yeoshuheng"},"content":" public PersonBuilder withIndustry(String industry) {","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"yeoshuheng"},"content":" this.industry \u003d new Industry(industry);","lastModifiedDate":"2024-02-25"},{"lineNumber":120,"author":{"gitId":"yeoshuheng"},"content":" return this;","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"yeoshuheng"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":122,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"yeoshuheng"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":125,"author":{"gitId":"yeoshuheng"},"content":" return new Person(name, fundingStage, industry, phone, email, address, tags);","lastModifiedDate":"2024-02-25"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"-":95,"yeoshuheng":33}},{"path":"src/test/java/seedu/address/testutil/PersonUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2017-04-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_FUNDING_STAGE;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"yeoshuheng"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_INDUSTRY;","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Set;","lastModifiedDate":"2018-03-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-03-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2018-03-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2018-03-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2017-03-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":34,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" sb.append(PREFIX_NAME + person.getName().fullName + \" \");","lastModifiedDate":"2017-06-06"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_FUNDING_STAGE + person.getFundingStage().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_INDUSTRY + person.getIndustry().value + \" \");","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":" sb.append(PREFIX_PHONE + person.getPhone().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":39,"author":{"gitId":"-"},"content":" sb.append(PREFIX_EMAIL + person.getEmail().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" sb.append(PREFIX_ADDRESS + person.getAddress().value + \" \");","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2017-05-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" s -\u003e sb.append(PREFIX_TAG + s.tagName + \" \")","lastModifiedDate":"2017-05-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static String getEditPersonDescriptorDetails(EditPersonDescriptor descriptor) {","lastModifiedDate":"2018-03-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name.fullName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" descriptor.getIndustry().ifPresent(industry -\u003e sb.append(PREFIX_INDUSTRY).append(industry.value).append(\" \"));","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"yeoshuheng"},"content":" descriptor.getFundingStage().ifPresent(fundingStage -\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" sb.append(PREFIX_FUNDING_STAGE).append(fundingStage.value).append(\" \"));","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"-"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address.value).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Set\u003cTag\u003e tags \u003d descriptor.getTags().get();","lastModifiedDate":"2018-03-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2018-03-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2018-03-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" } else {","lastModifiedDate":"2018-03-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" tags.forEach(s -\u003e sb.append(PREFIX_TAG).append(s.tagName).append(\" \"));","lastModifiedDate":"2018-03-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"-":62,"yeoshuheng":7}},{"path":"src/test/java/seedu/address/testutil/TypicalPersons.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.testutil;","lastModifiedDate":"2016-09-13"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;","lastModifiedDate":"2017-08-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-08-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-08-22"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-08-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-08-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-08-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-08-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * A utility class containing a list of {@code Person} objects to be used in tests.","lastModifiedDate":"2017-08-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-13"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class TypicalPersons {","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final Person ALICE \u003d new PersonBuilder().withName(\"Alice Pauline\")","lastModifiedDate":"2018-01-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .withAddress(\"123, Jurong West Ave 6, #08-111\").withEmail(\"alice@example.com\")","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"yeoshuheng"},"content":" .withPhone(\"94351253\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":" .withTags(\"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final Person BENSON \u003d new PersonBuilder().withName(\"Benson Meier\")","lastModifiedDate":"2018-01-10"},{"lineNumber":31,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"311, Clementi Ave 2, #02-25\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"-"},"content":" .withEmail(\"johnd@example.com\").withPhone(\"98765432\")","lastModifiedDate":"2017-04-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .withTags(\"owesMoney\", \"friends\").build();","lastModifiedDate":"2016-09-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final Person CARL \u003d new PersonBuilder().withName(\"Carl Kurz\").withPhone(\"95352563\")","lastModifiedDate":"2018-01-10"},{"lineNumber":35,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"heinz@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"wall street\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final Person DANIEL \u003d new PersonBuilder().withName(\"Daniel Meier\").withPhone(\"87652533\")","lastModifiedDate":"2018-01-10"},{"lineNumber":38,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"cornelia@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"10th street\").withTags(\"friends\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final Person ELLE \u003d new PersonBuilder().withName(\"Elle Meyer\").withPhone(\"9482224\")","lastModifiedDate":"2018-01-10"},{"lineNumber":41,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"werner@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"michegan ave\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final Person FIONA \u003d new PersonBuilder().withName(\"Fiona Kunz\").withPhone(\"9482427\")","lastModifiedDate":"2018-01-10"},{"lineNumber":44,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"lydia@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"little tokyo\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final Person GEORGE \u003d new PersonBuilder().withName(\"George Best\").withPhone(\"9482442\")","lastModifiedDate":"2018-01-10"},{"lineNumber":47,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"anna@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"4th street\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // Manually added","lastModifiedDate":"2016-09-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final Person HOON \u003d new PersonBuilder().withName(\"Hoon Meier\").withPhone(\"8482424\")","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"stefan@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"little india\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final Person IDA \u003d new PersonBuilder().withName(\"Ida Mueller\").withPhone(\"8482131\")","lastModifiedDate":"2018-01-10"},{"lineNumber":55,"author":{"gitId":"yeoshuheng"},"content":" .withEmail(\"hans@example.com\").withIndustry(\"finance\").withFundingStage(\"A\")","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"yeoshuheng"},"content":" .withAddress(\"chicago ave\").build();","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" // Manually added - Person\u0027s details found in {@code CommandTestUtil}","lastModifiedDate":"2017-08-22"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final Person AMY \u003d new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)","lastModifiedDate":"2018-01-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-09-21"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final Person BOB \u003d new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2018-01-10"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)","lastModifiedDate":"2017-09-21"},{"lineNumber":63,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2017-09-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-21"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static final String KEYWORD_MATCHING_MEIER \u003d \"Meier\"; // A keyword that matches MEIER","lastModifiedDate":"2017-09-21"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private TypicalPersons() {} // prevents instantiation","lastModifiedDate":"2017-07-20"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Returns an {@code AddressBook} with all the typical persons.","lastModifiedDate":"2017-08-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public static AddressBook getTypicalAddressBook() {","lastModifiedDate":"2017-08-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" AddressBook ab \u003d new AddressBook();","lastModifiedDate":"2017-08-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" for (Person person : getTypicalPersons()) {","lastModifiedDate":"2018-01-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" ab.addPerson(person);","lastModifiedDate":"2017-08-05"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return ab;","lastModifiedDate":"2016-09-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-04"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public static List\u003cPerson\u003e getTypicalPersons() {","lastModifiedDate":"2018-01-10"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return new ArrayList\u003c\u003e(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));","lastModifiedDate":"2017-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-04"},{"lineNumber":83,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-13"}],"authorContributionMap":{"-":67,"yeoshuheng":16}}] diff --git a/AY2324S2-CS2103T-W09-2_tp_master/commits.json b/AY2324S2-CS2103T-W09-2_tp_master/commits.json index 4a9d1091..40d8d9ef 100644 --- a/AY2324S2-CS2103T-W09-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-W09-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"dwangwk":[],"menatahari":[{"date":"2024-03-07","commitResults":[{"hash":"a8eb93c0cd4a775db4eede5a6f03de2aed2148ad","isMergeCommit":false,"messageTitle":"Update readme and uploaded photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":11}}},{"hash":"2ab29ded407cf63b39c4cfea3ca859652647986d","isMergeCommit":true,"messageTitle":"Merge pull request #15 from menatahari/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"yespiggy":[{"date":"2024-03-07","commitResults":[{"hash":"84063188a916022bf2f1b80803f0b8d8b3b2dafc","isMergeCommit":false,"messageTitle":"docs: Update DG User stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":13}}},{"hash":"fa249d62a450e496f8bf4fa2a07b6ef4cd6ffadd","isMergeCommit":true,"messageTitle":"Merge branch update DG user stories","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"676d51e0b69796e8a04234d2c15b914329cd0c96","isMergeCommit":true,"messageTitle":"Merge pull request #14 from yespiggy/master","messageBody":"Update user stories in DG","fileTypesAndContributionMap":{}}]}],"yeoshuheng":[{"date":"2024-02-25","commitResults":[{"hash":"842594880efd9ef12b06dd5f5716ce9d1c46de79","isMergeCommit":false,"messageTitle":"docs: Update profile","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":15}}},{"hash":"c0b6212b3fdc7805ddddcc7a791160c2730d1219","isMergeCommit":false,"messageTitle":"feat: Add Industry and FundingStage options","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":108,"deletions":5}}},{"hash":"9d4aa185e921f647f7079e1ec5eca32e36a298fa","isMergeCommit":false,"messageTitle":"feat: Add logic for industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":43,"deletions":17}}},{"hash":"ccc8a41ac1e34edbcc7189e0198a3ba61210178e","isMergeCommit":false,"messageTitle":"feat: Add sample for person with industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":35,"deletions":13}}},{"hash":"078b9e51de07a37bc01af8b33991d63b78c98578","isMergeCommit":false,"messageTitle":"feat: Update storage for industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":7}}},{"hash":"9ded1fc99b36c25649aa251c7c64d68005bc3d5a","isMergeCommit":false,"messageTitle":"test: Fix test for industry, funding","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":81,"deletions":26}}},{"hash":"38212e7a41db0be57ac52c5dc78795a5ffb6a434","isMergeCommit":false,"messageTitle":"feat: Add funding, industry for edit command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":36,"deletions":12}}},{"hash":"eb7c924496e743e877b752b944d33651d1978638","isMergeCommit":false,"messageTitle":"style: Fix checkstyle for test","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":23,"deletions":5}}},{"hash":"1ede8657f049bee88e8b82f71417b1a8c8c2b6e4","isMergeCommit":false,"messageTitle":"style: Fix checkstyle for main","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":73,"deletions":15}}},{"hash":"d178843dbf22a382046ba7a4beb1cb3437ae9814","isMergeCommit":false,"messageTitle":"test: Update test for funding, industry","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":176,"deletions":113}}},{"hash":"b2b9eb02bac1c24cc39fb2b8efc575a549532253","isMergeCommit":false,"messageTitle":"style: Fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":17}}}]},{"date":"2024-03-05","commitResults":[{"hash":"fb1bdef18772248a883d4eb0421a4c45a370c70a","isMergeCommit":false,"messageTitle":"fix: Add duplicate prefix checks","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1},"test-code":{"insertions":120,"deletions":0}}},{"hash":"aec40a6d3b801a6ddd30ac670bf513461480bd2e","isMergeCommit":false,"messageTitle":"test: Add test for funding stage \u0026 industry","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":205,"deletions":131}}},{"hash":"b773e6b431bdc5d09ffce4a4356131af78ddb243","isMergeCommit":true,"messageTitle":"Merge pull request #1 from yeoshuheng/branch-AddStartup","messageBody":"Branch add startup","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"728b2c0b2837cc516dc425fbc49fee8fd092bcc8","isMergeCommit":true,"messageTitle":"Merge pull request #9 from yeoshuheng/master","messageBody":"v1.1: Add startup \u0026 Assign Funding Stage","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"dwangwk":{"docs":0,"functional-code":0,"test-code":0},"menatahari":{"docs":19,"functional-code":0,"test-code":0},"yespiggy":{"docs":18,"functional-code":0,"test-code":0},"yeoshuheng":{"docs":13,"functional-code":300,"test-code":519}},"authorContributionVariance":{"dwangwk":0.0,"menatahari":59.69388,"yespiggy":72.22959,"yeoshuheng":62455.977},"authorDisplayNameMap":{"dwangwk":"CS2103T-W09-2 WANG..NIEL","menatahari":"CS2103T-W09-2 NATA..HARI","yespiggy":"CS2103T-W09-2 YE S..IFAN","yeoshuheng":"CS2103T-W09-2 YEO ..HENG"}} +{"authorDailyContributionsMap":{"dwangwk":[{"date":"2024-03-07","commitResults":[{"hash":"1499dc1041a33dd81b79a49768feaa09e6621c28","isMergeCommit":false,"messageTitle":"Docs: Update Profile","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":48,"deletions":6}}},{"hash":"6f6620f8977c5667616382a2af02c2584d143ef0","isMergeCommit":false,"messageTitle":"Docs: Updated Readme, DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":230,"deletions":39}}},{"hash":"56d9b344a27da1a1ec908a06899ced743f39dea4","isMergeCommit":false,"messageTitle":"Docs: About Us Sifan Image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b76da9e9d536129352e67dec71a3206d94080289","isMergeCommit":true,"messageTitle":"Merge pull request #17 from dwangwk/master","messageBody":"Update AboutUs, Readme, DeveloperGuide","fileTypesAndContributionMap":{}}]}],"menatahari":[{"date":"2024-03-07","commitResults":[{"hash":"a8eb93c0cd4a775db4eede5a6f03de2aed2148ad","isMergeCommit":false,"messageTitle":"Update readme and uploaded photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":11}}},{"hash":"2ab29ded407cf63b39c4cfea3ca859652647986d","isMergeCommit":true,"messageTitle":"Merge pull request #15 from menatahari/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"yespiggy":[{"date":"2024-03-07","commitResults":[{"hash":"84063188a916022bf2f1b80803f0b8d8b3b2dafc","isMergeCommit":false,"messageTitle":"docs: Update DG User stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":13}}},{"hash":"fa249d62a450e496f8bf4fa2a07b6ef4cd6ffadd","isMergeCommit":true,"messageTitle":"Merge branch update DG user stories","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"676d51e0b69796e8a04234d2c15b914329cd0c96","isMergeCommit":true,"messageTitle":"Merge pull request #14 from yespiggy/master","messageBody":"Update user stories in DG","fileTypesAndContributionMap":{}}]}],"yeoshuheng":[{"date":"2024-02-25","commitResults":[{"hash":"842594880efd9ef12b06dd5f5716ce9d1c46de79","isMergeCommit":false,"messageTitle":"docs: Update profile","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":15}}},{"hash":"c0b6212b3fdc7805ddddcc7a791160c2730d1219","isMergeCommit":false,"messageTitle":"feat: Add Industry and FundingStage options","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":108,"deletions":5}}},{"hash":"9d4aa185e921f647f7079e1ec5eca32e36a298fa","isMergeCommit":false,"messageTitle":"feat: Add logic for industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":43,"deletions":17}}},{"hash":"ccc8a41ac1e34edbcc7189e0198a3ba61210178e","isMergeCommit":false,"messageTitle":"feat: Add sample for person with industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":35,"deletions":13}}},{"hash":"078b9e51de07a37bc01af8b33991d63b78c98578","isMergeCommit":false,"messageTitle":"feat: Update storage for industry, funding","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":7}}},{"hash":"9ded1fc99b36c25649aa251c7c64d68005bc3d5a","isMergeCommit":false,"messageTitle":"test: Fix test for industry, funding","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":81,"deletions":26}}},{"hash":"38212e7a41db0be57ac52c5dc78795a5ffb6a434","isMergeCommit":false,"messageTitle":"feat: Add funding, industry for edit command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":36,"deletions":12}}},{"hash":"eb7c924496e743e877b752b944d33651d1978638","isMergeCommit":false,"messageTitle":"style: Fix checkstyle for test","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":23,"deletions":5}}},{"hash":"1ede8657f049bee88e8b82f71417b1a8c8c2b6e4","isMergeCommit":false,"messageTitle":"style: Fix checkstyle for main","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":73,"deletions":15}}},{"hash":"d178843dbf22a382046ba7a4beb1cb3437ae9814","isMergeCommit":false,"messageTitle":"test: Update test for funding, industry","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":176,"deletions":113}}},{"hash":"b2b9eb02bac1c24cc39fb2b8efc575a549532253","isMergeCommit":false,"messageTitle":"style: Fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":29,"deletions":17}}}]},{"date":"2024-03-05","commitResults":[{"hash":"fb1bdef18772248a883d4eb0421a4c45a370c70a","isMergeCommit":false,"messageTitle":"fix: Add duplicate prefix checks","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":2,"deletions":1},"test-code":{"insertions":120,"deletions":0}}},{"hash":"aec40a6d3b801a6ddd30ac670bf513461480bd2e","isMergeCommit":false,"messageTitle":"test: Add test for funding stage \u0026 industry","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":205,"deletions":131}}},{"hash":"b773e6b431bdc5d09ffce4a4356131af78ddb243","isMergeCommit":true,"messageTitle":"Merge pull request #1 from yeoshuheng/branch-AddStartup","messageBody":"Branch add startup","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"728b2c0b2837cc516dc425fbc49fee8fd092bcc8","isMergeCommit":true,"messageTitle":"Merge pull request #9 from yeoshuheng/master","messageBody":"v1.1: Add startup \u0026 Assign Funding Stage","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"3d2e99f939f367257f2c910af59461e14544db3b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"dwangwk":{"docs":263,"functional-code":0,"test-code":0},"menatahari":{"docs":19,"functional-code":0,"test-code":0},"yespiggy":{"docs":15,"functional-code":0,"test-code":0},"yeoshuheng":{"docs":9,"functional-code":300,"test-code":519}},"authorContributionVariance":{"dwangwk":7005.7393,"menatahari":59.69388,"yespiggy":72.22959,"yeoshuheng":62455.977},"authorDisplayNameMap":{"dwangwk":"CS2103T-W09-2 WANG..NIEL","menatahari":"CS2103T-W09-2 NATA..HARI","yespiggy":"CS2103T-W09-2 YE S..IFAN","yeoshuheng":"CS2103T-W09-2 YEO ..HENG"}} diff --git a/AY2324S2-CS2103T-W10-1_tp_master/authorship.json b/AY2324S2-CS2103T-W10-1_tp_master/authorship.json index b667962a..31269627 100644 --- a/AY2324S2-CS2103T-W10-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W10-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"UdhayaShan1"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W10-1/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2024-02-28"},{"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":"UdhayaShan1"},"content":"# Welcome to Realodex","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"UdhayaShan1"},"content":"* This is **CS2103T W10-1\u0027s Brownfield implementation of AddressBook 3** .\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"UdhayaShan1"},"content":"## So what is this project about?","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"UdhayaShan1"},"content":"* This project aims to help real estate agents with keeping track of their client data in their day-to-day activity.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"UdhayaShan1"},"content":"* This project is also optimised for fast typing users and hence we will focus on a well optimised CLI system.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"UdhayaShan1"},"content":"* The project simulates an ongoing software project for a desktop application by extending CS2103T\u0027s existing project (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"UdhayaShan1"},"content":" * It is **written in OOP fashion**. It provides a **very 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-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"UdhayaShan1"},"content":"* It is named `Realodex` (`RDX` for short) as we were inspired by the real life Rolodex that helps store a contact list. Importantly, it sounds catchy too. ","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"UdhayaShan1"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://ay2324s2-cs2103t-w10-1.github.io/tp/)**.","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"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":20,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"UdhayaShan1"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"UdhayaShan1":13,"-":8}},{"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":"appleraincoat"},"content":"You can reach us at the email `cs2103t_w10_1[at]comp.nus.edu.sg`","lastModifiedDate":"2024-02-28"},{"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":"appleraincoat"},"content":"### James Lau","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"appleraincoat"},"content":"\u003cimg src\u003d\"images/appleraincoat.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"appleraincoat"},"content":"[[github](https://github.com/appleraincoat)]","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"appleraincoat"},"content":"[[portfolio](team/appleraincoat)]","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"jyztintan"},"content":"### Tan Wee Kian, Justin","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"jyztintan"},"content":"\u003cimg src\u003d\"images/jyztintan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jyztintan"},"content":"[[github](http://github.com/jyztintan)]","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"jyztintan"},"content":"[[portfolio](team/jyztintan.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"jyztintan"},"content":"* Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"jyztintan"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"wapisai"},"content":"### Alicia Yap","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"wapisai"},"content":"\u003cimg src\u003d\"images/wapisai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"wapisai"},"content":"[[github](http://github.com/wapisai)] [[portfolio](team/wapisai.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"4llysa"},"content":"### Allysa Tan","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"4llysa"},"content":"\u003cimg src\u003d\"images/4llysa.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"4llysa"},"content":"[[github](http://github.com/4llysa)]","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"4llysa"},"content":"[[portfolio](team/4llysa.md)]","lastModifiedDate":"2024-02-28"},{"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":"UdhayaShan1"},"content":"### Shanmugam Udhaya","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"UdhayaShan1"},"content":"\u003cimg src\u003d\"images/udhayashan1.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"UdhayaShan1"},"content":"[[github](http://github.com/udhayashan1)]","lastModifiedDate":"2024-02-28"},{"lineNumber":58,"author":{"gitId":"UdhayaShan1"},"content":"[[portfolio](team/udhaya.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"UdhayaShan1"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"4llysa":4,"jyztintan":6,"-":38,"UdhayaShan1":5,"appleraincoat":5,"wapisai":3}},{"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":"jyztintan"},"content":"# Realodex Developer Guide","lastModifiedDate":"2024-03-01"},{"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":"wapisai"},"content":"* A real estate agent","lastModifiedDate":"2024-02-28"},{"lineNumber":278,"author":{"gitId":"wapisai"},"content":"* has a need to manage a significant number of contacts of their clients","lastModifiedDate":"2024-02-28"},{"lineNumber":279,"author":{"gitId":"wapisai"},"content":"* has to note down many details about each client","lastModifiedDate":"2024-02-28"},{"lineNumber":280,"author":{"gitId":"wapisai"},"content":"* has to frequently add, delete, and search for clients","lastModifiedDate":"2024-02-28"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"jyztintan"},"content":"* is a real estate agent that wants to store relevant information about clients","lastModifiedDate":"2024-02-28"},{"lineNumber":285,"author":{"gitId":"jyztintan"},"content":"* able to store additional notes about contacts","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"jyztintan"},"content":"**Value proposition**: ","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"jyztintan"},"content":"* manage contacts faster than a typical mouse/GUI driven applications. ","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"jyztintan"},"content":"* storing of information tailored to real-estate agents","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"jyztintan"},"content":"|----------|----------------------------|----------------------------------------------------------|---------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-02-28"},{"lineNumber":298,"author":{"gitId":"jyztintan"},"content":"| `* * *` | first-time user | receive a simple tutorial on app usage | easily navigate Realodex |","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"jyztintan"},"content":"| `* * *` | tech-savvy user | use a command-line interface | navigate the app more efficiently due to my fast typing speed |","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"jyztintan"},"content":"| `* * *` | fast typer | quickly input various commands in the text box | perform actions like adding new clients, editing profiles, finding clients, without using GUI |","lastModifiedDate":"2024-02-28"},{"lineNumber":301,"author":{"gitId":"jyztintan"},"content":"| `* * *` | real-estate agent user | easily log personal notes after client interactions | reference these in future conversations for more personalized communication |","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"jyztintan"},"content":"| `* * *` | user with inactive clients | delete inactive clients permanently | remove them from my database and free up space |","lastModifiedDate":"2024-02-28"},{"lineNumber":303,"author":{"gitId":"jyztintan"},"content":"| `* *` | real estate agent user | search for clients interested in specific property listings | quickly match selling and buying clients |","lastModifiedDate":"2024-02-28"},{"lineNumber":304,"author":{"gitId":"jyztintan"},"content":"| `* *` | real estate agent user | record and access clients\u0027 preferred house types | filter and match clients with relevant property listings |","lastModifiedDate":"2024-02-28"},{"lineNumber":305,"author":{"gitId":"jyztintan"},"content":"| `* *` | real estate agent user | analyze trends in housing preferences | understand market demands and tailor my services |","lastModifiedDate":"2024-02-28"},{"lineNumber":306,"author":{"gitId":"jyztintan"},"content":"| `* *` | efficient user | filter clients by tag | organize and access client information more efficiently |","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"jyztintan"},"content":"| `* *` | efficient user | filter clients by categories | better categorize and manage client information based on personal attributes |","lastModifiedDate":"2024-02-28"},{"lineNumber":308,"author":{"gitId":"jyztintan"},"content":"| `* *` | first-time user | be guided through setting up my user profile | save my details for future use |","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"jyztintan"},"content":"| `* *` | first-time user | learn how to create and edit client profiles | manage client information efficiently |","lastModifiedDate":"2024-02-28"},{"lineNumber":310,"author":{"gitId":"jyztintan"},"content":"| `* *` | first-time user | understand how to navigate the app and use CLI commands | effectively use Realodex\u0027s features |","lastModifiedDate":"2024-02-28"},{"lineNumber":311,"author":{"gitId":"jyztintan"},"content":"| `* *` | forgetful user | get instructions on how to set up profiles and navigate | refresh my memory on how to use Realodex when needed |","lastModifiedDate":"2024-02-28"},{"lineNumber":312,"author":{"gitId":"jyztintan"},"content":"| `* *` | user with inactive clients | archive inactive clients | hide them from my active list while keeping their information for future reference |","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"jyztintan"},"content":"| `* ` | real estate agent user | be notified of upcoming client birthdays | send personalized greetings and strengthen my relationships |","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"jyztintan"},"content":"| `*` | real estate agent user | be notified of upcoming holidays | prepare gifts for my clients and enhance our relationship |","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"jyztintan"},"content":"| `*` | real estate agent user | be reminded of significant client milestones | acknowledge these events and further personalize our relationship |","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"jyztintan"},"content":"| `*` | tech-savvy user | use tab to autofill parts of my command | speed up my use of the command line |","lastModifiedDate":"2024-02-28"},{"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":"UdhayaShan1"},"content":"(For all use cases below, the **System** is the `Realodex` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"UdhayaShan1"},"content":"**Use case: Creating a user profile**","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"UdhayaShan1"},"content":"**Actor: User**","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"UdhayaShan1"},"content":"**Description: This use case outlines the steps involved in adding a new client profile to Realodex. The user initiates the process by executing the \"Add client\" command, and the system guides them through sequential steps to gather and confirm client details.**","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"UdhayaShan1"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":330,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":331,"author":{"gitId":"UdhayaShan1"},"content":"1. User Executes \"Add client....\" Command:","lastModifiedDate":"2024-03-01"},{"lineNumber":332,"author":{"gitId":"UdhayaShan1"},"content":"2. System adds use profile to local storage and replies to user with success message.","lastModifiedDate":"2024-03-01"},{"lineNumber":333,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":334,"author":{"gitId":"UdhayaShan1"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":335,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"UdhayaShan1"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":337,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":338,"author":{"gitId":"UdhayaShan1"},"content":"* 1a. Name exceeds the length constraints.","lastModifiedDate":"2024-03-01"},{"lineNumber":339,"author":{"gitId":"UdhayaShan1"},"content":" * 1a1. Realodex throws an error and requests shorter name representation.","lastModifiedDate":"2024-03-01"},{"lineNumber":340,"author":{"gitId":"UdhayaShan1"},"content":" * 1a2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":341,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":342,"author":{"gitId":"UdhayaShan1"},"content":"* 1b. Name Length is not fully English.","lastModifiedDate":"2024-03-01"},{"lineNumber":343,"author":{"gitId":"UdhayaShan1"},"content":" * 1b1. Realodex throws an error and requests for only English input.","lastModifiedDate":"2024-03-01"},{"lineNumber":344,"author":{"gitId":"UdhayaShan1"},"content":" * 1b2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":345,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":346,"author":{"gitId":"UdhayaShan1"},"content":"* 1c. Name contains erraneous whitespace.","lastModifiedDate":"2024-03-01"},{"lineNumber":347,"author":{"gitId":"UdhayaShan1"},"content":" * 1c1. Realodex throws a warning and fixes this for user.","lastModifiedDate":"2024-03-01"},{"lineNumber":348,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":349,"author":{"gitId":"UdhayaShan1"},"content":"* 1d. Name is not capitalized.","lastModifiedDate":"2024-03-01"},{"lineNumber":350,"author":{"gitId":"UdhayaShan1"},"content":" * 1d1. Realodex throws a warning and fixes this for user.","lastModifiedDate":"2024-03-01"},{"lineNumber":351,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":352,"author":{"gitId":"UdhayaShan1"},"content":"* 1e. Name is not in expected format.","lastModifiedDate":"2024-03-01"},{"lineNumber":353,"author":{"gitId":"UdhayaShan1"},"content":" * 1e1. Realodex throws an error and highlights the format to user.","lastModifiedDate":"2024-03-01"},{"lineNumber":354,"author":{"gitId":"UdhayaShan1"},"content":" * 1e2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":355,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":356,"author":{"gitId":"UdhayaShan1"},"content":"* 1f. Address is not fully English ","lastModifiedDate":"2024-03-01"},{"lineNumber":357,"author":{"gitId":"UdhayaShan1"},"content":" * 1f1. Realodex throws an error and requests for only English input.","lastModifiedDate":"2024-03-01"},{"lineNumber":358,"author":{"gitId":"UdhayaShan1"},"content":" * 1f2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":359,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":360,"author":{"gitId":"UdhayaShan1"},"content":"* 1g. Address exceeds the length constraints","lastModifiedDate":"2024-03-01"},{"lineNumber":361,"author":{"gitId":"UdhayaShan1"},"content":" * 1g1. Realodex throws an error and requests shorter address representation.","lastModifiedDate":"2024-03-01"},{"lineNumber":362,"author":{"gitId":"UdhayaShan1"},"content":" * 1g2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":363,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":364,"author":{"gitId":"UdhayaShan1"},"content":"* 1h. Address is not capitalized for each part.","lastModifiedDate":"2024-03-01"},{"lineNumber":365,"author":{"gitId":"UdhayaShan1"},"content":" * 1h1. Realodex throws a warning and fixes this for user.","lastModifiedDate":"2024-03-01"},{"lineNumber":366,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":367,"author":{"gitId":"UdhayaShan1"},"content":"* 1i. Income is not in SGD","lastModifiedDate":"2024-03-01"},{"lineNumber":368,"author":{"gitId":"UdhayaShan1"},"content":" * 1i. Realodex throws an error and requests a SGD value.","lastModifiedDate":"2024-03-01"},{"lineNumber":369,"author":{"gitId":"UdhayaShan1"},"content":" * 1i2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":370,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":371,"author":{"gitId":"UdhayaShan1"},"content":"* 1j. Income is negative","lastModifiedDate":"2024-03-01"},{"lineNumber":372,"author":{"gitId":"UdhayaShan1"},"content":" * 1j1. Realodex throws an error and requests a positive income value.","lastModifiedDate":"2024-03-01"},{"lineNumber":373,"author":{"gitId":"UdhayaShan1"},"content":" * 1j2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":374,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":375,"author":{"gitId":"UdhayaShan1"},"content":"* 1k. Additonal notes exceed length constraints.","lastModifiedDate":"2024-03-01"},{"lineNumber":376,"author":{"gitId":"UdhayaShan1"},"content":" * 1k1. Realodex throws an error and requests a shorter input.","lastModifiedDate":"2024-03-01"},{"lineNumber":377,"author":{"gitId":"UdhayaShan1"},"content":" * 1k2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":379,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"UdhayaShan1"},"content":"1. User requests to delete user","lastModifiedDate":"2024-03-01"},{"lineNumber":384,"author":{"gitId":"UdhayaShan1"},"content":"2. Realodex deletes the person with success message","lastModifiedDate":"2024-03-01"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"wapisai"},"content":"* 2a. The input name is not found","lastModifiedDate":"2024-02-28"},{"lineNumber":391,"author":{"gitId":"UdhayaShan1"},"content":" * 2a1. Realodex shows an error message \"\u003cName\u003e is not found\".","lastModifiedDate":"2024-03-01"},{"lineNumber":392,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":393,"author":{"gitId":"wapisai"},"content":"**Use case: List**","lastModifiedDate":"2024-02-28"},{"lineNumber":394,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":395,"author":{"gitId":"wapisai"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":396,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":397,"author":{"gitId":"wapisai"},"content":"1. User requests to list","lastModifiedDate":"2024-02-28"},{"lineNumber":398,"author":{"gitId":"wapisai"},"content":"2. Realodex shows the list of all clients","lastModifiedDate":"2024-02-28"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"wapisai"},"content":"* 2a. The list is empty","lastModifiedDate":"2024-02-28"},{"lineNumber":405,"author":{"gitId":"UdhayaShan1"},"content":" * 2a1. Realodex shows an empty list.","lastModifiedDate":"2024-03-01"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"wapisai"},"content":"**Use case: Find**","lastModifiedDate":"2024-02-28"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":409,"author":{"gitId":"wapisai"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":411,"author":{"gitId":"UdhayaShan1"},"content":"1. User requests to find user","lastModifiedDate":"2024-03-01"},{"lineNumber":412,"author":{"gitId":"UdhayaShan1"},"content":"2. Realodex shows the list of all clients with name including the name input","lastModifiedDate":"2024-03-01"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":414,"author":{"gitId":"wapisai"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":415,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":416,"author":{"gitId":"wapisai"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":417,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":418,"author":{"gitId":"UdhayaShan1"},"content":"* 2a. No contact found with a name including the name input","lastModifiedDate":"2024-03-01"},{"lineNumber":419,"author":{"gitId":"UdhayaShan1"},"content":" * 2a1. Realodex shows an empty list.","lastModifiedDate":"2024-03-01"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"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":425,"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":426,"author":{"gitId":"4llysa"},"content":"3. A real estate agent 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-02-28"},{"lineNumber":427,"author":{"gitId":"4llysa"},"content":"4. Should be able to have up to 500 profiles.","lastModifiedDate":"2024-02-28"},{"lineNumber":428,"author":{"gitId":"4llysa"},"content":"5. The response to any command should become visible within 5 seconds.","lastModifiedDate":"2024-02-28"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":433,"author":{"gitId":"4llysa"},"content":"* **Client Profile**: Details of customer of the Real Esate Agent looking to buy / sell / rent a property","lastModifiedDate":"2024-02-28"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":443,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":444,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"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":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"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":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"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":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"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":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"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":478,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"4llysa":4,"jyztintan":26,"-":374,"UdhayaShan1":65,"wapisai":19}},{"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":"appleraincoat"},"content":"# Realodex (RDX) User Guide","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"appleraincoat"},"content":"Realodex (or RDX for short) is a **desktop app for managing client contacts, optimized for use via a ","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"appleraincoat"},"content":"Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). ","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"appleraincoat"},"content":"If you can type fast, RDX can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-02-28"},{"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":"appleraincoat"},"content":"1. Ensure you have Java `11` or above installed in your computer.","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"appleraincoat"},"content":"1. Download the latest `realodex.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"appleraincoat"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your Realodex.","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"appleraincoat"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar realodex.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"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":"appleraincoat"},"content":"1. Some example commands you can try:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"appleraincoat"},"content":" * `add n/John Doe a/John street, block 123, #01-01 i/$5000 fs/4 an/Looking for a quiet neighbourhood.` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"appleraincoat"},"content":" * `delete John Doe` : Deletes the client with name `John Doe` from the current list.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","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":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"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":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"appleraincoat"},"content":" e.g. if the command specifies `n/NAME a/ADDRESS`, `a/ADDRESS n/NAME` is also acceptable.","lastModifiedDate":"2024-03-01"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":52,"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":53,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"appleraincoat"},"content":"### Adding a client: `add`","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"appleraincoat"},"content":"Adds a client to the Realodex.","lastModifiedDate":"2024-02-28"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"appleraincoat"},"content":"Format: `add n/NAME a/ADDRESS i/INCOME fs/FAMILY_SIZE an/ADDITIONAL_NOTES`","lastModifiedDate":"2024-03-01"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"appleraincoat"},"content":"* `add n/John Doe a/John street, block 123, #01-01 i/$5000 fs/4 an/Looking for a quiet neighbourhood.`","lastModifiedDate":"2024-03-01"},{"lineNumber":63,"author":{"gitId":"appleraincoat"},"content":"* `add n/Betsy Crowe a/Newgate Prison i/$0 fs/1 an/NIL.`","lastModifiedDate":"2024-03-01"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"appleraincoat"},"content":"### Deleting a client : `delete`","lastModifiedDate":"2024-02-28"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"appleraincoat"},"content":"Deletes the specified client from the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"appleraincoat"},"content":"Format: `delete NAME`","lastModifiedDate":"2024-03-01"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"appleraincoat"},"content":"enter client\u0027s `NAME` after prompt is shown","lastModifiedDate":"2024-03-01"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":73,"author":{"gitId":"appleraincoat"},"content":"* Deletes the client of the specified `NAME`.","lastModifiedDate":"2024-03-01"},{"lineNumber":74,"author":{"gitId":"appleraincoat"},"content":"* If name is **not found**, error message will be shown `\"NAME\" is not found`.","lastModifiedDate":"2024-03-01"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"appleraincoat"},"content":"* `delete` followed by `Udhaya Shanmugam` deletes the client in the address book with the name \"Udhaya Shanmugam.","lastModifiedDate":"2024-03-01"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"appleraincoat"},"content":"Realodex data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-02-28"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":91,"author":{"gitId":"appleraincoat"},"content":"Realodex data are saved automatically as a JSON file `[JAR file location]/data/realodex.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":95,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"appleraincoat"},"content":"If your changes to the data file makes its format invalid, Realodex 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-28"},{"lineNumber":97,"author":{"gitId":"appleraincoat"},"content":"Furthermore, certain edits can cause the Realodex 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":"2024-02-28"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":100,"author":{"gitId":"appleraincoat"},"content":"### Listing all clients `[coming in v1.2]`","lastModifiedDate":"2024-02-28"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":105,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"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":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":116,"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":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":124,"author":{"gitId":"appleraincoat"},"content":"**Add** | `add n/NAME a/ADDRESS i/INCOME fs/FAMILY_SIZE an/ADDITIONAL_NOTES` \u003cbr\u003e e.g., `add n/John Doe a/John street, block 123, #01-01 i/$5000 fs/4 an/Looking for a quiet neighbourhood.`","lastModifiedDate":"2024-03-01"},{"lineNumber":125,"author":{"gitId":"appleraincoat"},"content":"**Delete** | `delete NAME`\u003cbr\u003e e.g., `delete John`","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"-":93,"appleraincoat":31,"wapisai":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":"4llysa"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eRealodex\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"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":{"4llysa":1,"-":66}},{"path":"docs/team/4llysa.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"4llysa"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"4llysa"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"4llysa"},"content":" title: \"Allysa Tan\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"4llysa"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"4llysa"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":9,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"4llysa"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"4llysa"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":14,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":15,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":16,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":17,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"4llysa"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"4llysa"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"4llysa"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"4llysa"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"4llysa"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"4llysa"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"4llysa"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"4llysa"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"4llysa"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"4llysa"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"4llysa"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"4llysa"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"4llysa"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"4llysa"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"4llysa"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"4llysa"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"4llysa"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"4llysa"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"4llysa"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"4llysa"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"4llysa"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"4llysa"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"4llysa":46}},{"path":"docs/team/appleraincoat.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":"appleraincoat"},"content":" title: \"appleraincoat\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"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":"appleraincoat"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user ","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"appleraincoat"},"content":"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-28"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"appleraincoat"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed ","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"appleraincoat"},"content":" * by using the redo command.","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"appleraincoat"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the ","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"appleraincoat"},"content":" * app should provide a convenient way to rectify them.","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"appleraincoat"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth ","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"appleraincoat"},"content":" * analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"appleraincoat"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in ","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"appleraincoat"},"content":" * the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"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":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"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":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"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":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":40,"appleraincoat":11}},{"path":"docs/team/jyztintan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jyztintan"},"content":"\u003ch1 align\u003d\"center\"\u003eHello there 👋, I\u0027m Justin \u003c/h1\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"jyztintan"},"content":"\u003ch2 align\u003d\"center\"\u003eYear 2 Computer Science Undergraduate || Teaching Assistant \u003c/h2\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"jyztintan"},"content":"\u003ch3 align\u003d\"center\"\u003eNational University of Singapore, School of Computing \u003c/h3\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"jyztintan"},"content":"- 🧠 I’m currently learning 🤖 Machine Learning and AI, 📊 Algorithmic Design and Analysis and 💻 Software Engineering","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"jyztintan"},"content":"- 📫 Reach out to me at **justintanwk2001@gmail.com**","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"jyztintan"},"content":"- 💡 Teaching Assistant for ♾ Discrete Mathematics and 🐍 Python Programming Methodology","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"jyztintan"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"jyztintan"},"content":"\u003ch3 align\u003d\"left\"\u003eConnect with me:\u003c/h3\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"jyztintan"},"content":"\u003cp align\u003d\"left\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.linkedin.com/in/tan-wee-kian-justin/\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/linked-in-alt.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"adam pithewan\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"jyztintan"},"content":" \u003c!--","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://fb.com/adam pithen wala\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/facebook.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"adam pithen wala\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://instagram.com/_._.adam._\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/instagram.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"_._.adam._\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.hackerrank.com/adampithewan\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/hackerrank.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"adampithewan\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://twitter.com/adam_pithenwala\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/twitter.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"adampithewan\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"jyztintan"},"content":" --\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"jyztintan"},"content":"\u003c/p\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"jyztintan"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"jyztintan"},"content":"\u003ch3 align\u003d\"left\"\u003eLanguages and Tools:\u003c/h3\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"jyztintan"},"content":"\u003cp align\u003d\"left\"\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.python.org\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/python/python-original.svg\" alt\u003d\"python\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://pandas.pydata.org/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/2ae2a900d2f041da66e950e4d48052658d850630/icons/pandas/pandas-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"pandas\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.java.com\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/java/java-original.svg\" alt\u003d\"java\" width\u003d\"40\"","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"jyztintan"},"content":" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.cprogramming.com/\" target\u003d\"_blank\"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"jyztintan"},"content":" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/c/c-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"c\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.w3schools.com/cpp/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/cplusplus/cplusplus-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":50,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"cplusplus\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://flutter.dev\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":52,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/flutter/flutter-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":53,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"flutter\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://dart.dev\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/dart/dart-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"dart\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":57,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://firebase.google.com/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":58,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/firebase/firebase-plain.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"firebase\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":60,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.photoshop.com/en\" target\u003d\"_blank\"","lastModifiedDate":"2024-02-28"},{"lineNumber":61,"author":{"gitId":"jyztintan"},"content":" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/photoshop/photoshop-line.svg\" alt\u003d\"photoshop\"","lastModifiedDate":"2024-02-28"},{"lineNumber":62,"author":{"gitId":"jyztintan"},"content":" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":63,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":64,"author":{"gitId":"jyztintan"},"content":" \u003c!--","lastModifiedDate":"2024-02-28"},{"lineNumber":65,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://developer.android.com\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":66,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/android/android-original-wordmark.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":67,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"android\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":68,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://getbootstrap.com\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":69,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/bootstrap/bootstrap-plain-wordmark.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":70,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"bootstrap\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":71,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.w3schools.com/css/\" target\u003d\"_blank\"","lastModifiedDate":"2024-02-28"},{"lineNumber":72,"author":{"gitId":"jyztintan"},"content":" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/css3/css3-original-wordmark.svg\" alt\u003d\"css3\"","lastModifiedDate":"2024-02-28"},{"lineNumber":73,"author":{"gitId":"jyztintan"},"content":" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":74,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.w3.org/html/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":75,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/html5/html5-original-wordmark.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":76,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"html5\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":77,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.adobe.com/in/products/illustrator.html\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":78,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://www.vectorlogo.zone/logos/adobe_illustrator/adobe_illustrator-icon.svg\" alt\u003d\"illustrator\" width\u003d\"40\"","lastModifiedDate":"2024-02-28"},{"lineNumber":79,"author":{"gitId":"jyztintan"},"content":" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":80,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/JavaScript\" target\u003d\"_blank\"","lastModifiedDate":"2024-02-28"},{"lineNumber":81,"author":{"gitId":"jyztintan"},"content":" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/javascript/javascript-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":82,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"javascript\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":83,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://kotlinlang.org\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://www.vectorlogo.zone/logos/kotlinlang/kotlinlang-icon.svg\" alt\u003d\"kotlin\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":84,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.mysql.com/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/mysql/mysql-original-wordmark.svg\" alt\u003d\"mysql\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":85,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://nodejs.org\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/nodejs/nodejs-original-wordmark.svg\" alt\u003d\"nodejs\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":86,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://reactjs.org/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":87,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/react/react-original-wordmark.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":88,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"react\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":89,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://sass-lang.com\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":90,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/sass/sass-original.svg\" alt\u003d\"sass\" width\u003d\"40\"","lastModifiedDate":"2024-02-28"},{"lineNumber":91,"author":{"gitId":"jyztintan"},"content":" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"jyztintan"},"content":" --\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":93,"author":{"gitId":"jyztintan"},"content":"\u003c/p\u003e","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"jyztintan":93}},{"path":"docs/team/udhayashan1.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"UdhayaShan1"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"UdhayaShan1"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"UdhayaShan1"},"content":" title: \"Udhaya\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"UdhayaShan1"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"UdhayaShan1"},"content":"### Not complete and not accurate, copied straight from johndoe.md","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"UdhayaShan1"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":9,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"UdhayaShan1"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"UdhayaShan1"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":14,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":15,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":16,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":17,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"UdhayaShan1"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"UdhayaShan1"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"UdhayaShan1"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"UdhayaShan1"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"UdhayaShan1"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"UdhayaShan1"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"UdhayaShan1"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"UdhayaShan1"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"UdhayaShan1"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"UdhayaShan1"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"UdhayaShan1"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"UdhayaShan1"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"UdhayaShan1"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"UdhayaShan1"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"UdhayaShan1"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"UdhayaShan1"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"UdhayaShan1"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"UdhayaShan1"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"UdhayaShan1"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"UdhayaShan1"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"UdhayaShan1"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"UdhayaShan1"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"UdhayaShan1":46}},{"path":"docs/team/wapisai.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"wapisai"},"content":" title: \"Alicia\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"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":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"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":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"-":45,"wapisai":1}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"UdhayaShan1"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W10-1/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2024-02-28"},{"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":"UdhayaShan1"},"content":"# Welcome to Realodex","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"UdhayaShan1"},"content":"* This is **CS2103T W10-1\u0027s Brownfield implementation of AddressBook 3** .\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"UdhayaShan1"},"content":"## So what is this project about?","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"UdhayaShan1"},"content":"* This project aims to help real estate agents with keeping track of their client data in their day-to-day activity.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"UdhayaShan1"},"content":"* This project is also optimised for fast typing users and hence we will focus on a well optimised CLI system.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"UdhayaShan1"},"content":"* The project simulates an ongoing software project for a desktop application by extending CS2103T\u0027s existing project (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"UdhayaShan1"},"content":" * It is **written in OOP fashion**. It provides a **very 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-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"UdhayaShan1"},"content":"* It is named `Realodex` (`RDX` for short) as we were inspired by the real life Rolodex that helps store a contact list. Importantly, it sounds catchy too. ","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"UdhayaShan1"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://ay2324s2-cs2103t-w10-1.github.io/tp/)**.","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"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":20,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"UdhayaShan1"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"UdhayaShan1":13,"-":8}},{"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":"appleraincoat"},"content":"You can reach us at the email `cs2103t_w10_1[at]comp.nus.edu.sg`","lastModifiedDate":"2024-02-28"},{"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":"appleraincoat"},"content":"### James Lau","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"appleraincoat"},"content":"\u003cimg src\u003d\"images/appleraincoat.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"appleraincoat"},"content":"[[github](https://github.com/appleraincoat)]","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"appleraincoat"},"content":"[[portfolio](team/appleraincoat)]","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"jyztintan"},"content":"### Tan Wee Kian, Justin","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"jyztintan"},"content":"\u003cimg src\u003d\"images/jyztintan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jyztintan"},"content":"[[github](http://github.com/jyztintan)]","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"jyztintan"},"content":"[[portfolio](team/jyztintan.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"jyztintan"},"content":"* Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"jyztintan"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"wapisai"},"content":"### Alicia Yap","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"wapisai"},"content":"\u003cimg src\u003d\"images/wapisai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"wapisai"},"content":"[[github](http://github.com/wapisai)] [[portfolio](team/wapisai.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"4llysa"},"content":"### Allysa Tan","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"4llysa"},"content":"\u003cimg src\u003d\"images/4llysa.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"4llysa"},"content":"[[github](http://github.com/4llysa)]","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"4llysa"},"content":"[[portfolio](team/4llysa.md)]","lastModifiedDate":"2024-02-28"},{"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":"UdhayaShan1"},"content":"### Shanmugam Udhaya","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"UdhayaShan1"},"content":"\u003cimg src\u003d\"images/udhayashan1.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"UdhayaShan1"},"content":"[[github](http://github.com/udhayashan1)]","lastModifiedDate":"2024-02-28"},{"lineNumber":58,"author":{"gitId":"UdhayaShan1"},"content":"[[portfolio](team/udhaya.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"UdhayaShan1"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"4llysa":4,"jyztintan":6,"-":38,"UdhayaShan1":5,"appleraincoat":5,"wapisai":3}},{"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":"jyztintan"},"content":"# Realodex Developer Guide","lastModifiedDate":"2024-03-01"},{"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":"wapisai"},"content":"* A real estate agent","lastModifiedDate":"2024-02-28"},{"lineNumber":278,"author":{"gitId":"wapisai"},"content":"* has a need to manage a significant number of contacts of their clients","lastModifiedDate":"2024-02-28"},{"lineNumber":279,"author":{"gitId":"wapisai"},"content":"* has to note down many details about each client","lastModifiedDate":"2024-02-28"},{"lineNumber":280,"author":{"gitId":"wapisai"},"content":"* has to frequently add, delete, and search for clients","lastModifiedDate":"2024-02-28"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"jyztintan"},"content":"* is a real estate agent that wants to store relevant information about clients","lastModifiedDate":"2024-02-28"},{"lineNumber":285,"author":{"gitId":"jyztintan"},"content":"* able to store additional notes about contacts","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"jyztintan"},"content":"**Value proposition**: ","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"jyztintan"},"content":"* manage contacts faster than a typical mouse/GUI driven applications. ","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"jyztintan"},"content":"* storing of information tailored to real-estate agents","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"jyztintan"},"content":"|----------|----------------------------|----------------------------------------------------------|---------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-02-28"},{"lineNumber":298,"author":{"gitId":"jyztintan"},"content":"| `* * *` | first-time user | receive a simple tutorial on app usage | easily navigate Realodex |","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"jyztintan"},"content":"| `* * *` | tech-savvy user | use a command-line interface | navigate the app more efficiently due to my fast typing speed |","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"jyztintan"},"content":"| `* * *` | fast typer | quickly input various commands in the text box | perform actions like adding new clients, editing profiles, finding clients, without using GUI |","lastModifiedDate":"2024-02-28"},{"lineNumber":301,"author":{"gitId":"jyztintan"},"content":"| `* * *` | real-estate agent user | easily log personal notes after client interactions | reference these in future conversations for more personalized communication |","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"jyztintan"},"content":"| `* * *` | user with inactive clients | delete inactive clients permanently | remove them from my database and free up space |","lastModifiedDate":"2024-02-28"},{"lineNumber":303,"author":{"gitId":"jyztintan"},"content":"| `* *` | real estate agent user | search for clients interested in specific property listings | quickly match selling and buying clients |","lastModifiedDate":"2024-02-28"},{"lineNumber":304,"author":{"gitId":"jyztintan"},"content":"| `* *` | real estate agent user | record and access clients\u0027 preferred house types | filter and match clients with relevant property listings |","lastModifiedDate":"2024-02-28"},{"lineNumber":305,"author":{"gitId":"jyztintan"},"content":"| `* *` | real estate agent user | analyze trends in housing preferences | understand market demands and tailor my services |","lastModifiedDate":"2024-02-28"},{"lineNumber":306,"author":{"gitId":"jyztintan"},"content":"| `* *` | efficient user | filter clients by tag | organize and access client information more efficiently |","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"jyztintan"},"content":"| `* *` | efficient user | filter clients by categories | better categorize and manage client information based on personal attributes |","lastModifiedDate":"2024-02-28"},{"lineNumber":308,"author":{"gitId":"jyztintan"},"content":"| `* *` | first-time user | be guided through setting up my user profile | save my details for future use |","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"jyztintan"},"content":"| `* *` | first-time user | learn how to create and edit client profiles | manage client information efficiently |","lastModifiedDate":"2024-02-28"},{"lineNumber":310,"author":{"gitId":"jyztintan"},"content":"| `* *` | first-time user | understand how to navigate the app and use CLI commands | effectively use Realodex\u0027s features |","lastModifiedDate":"2024-02-28"},{"lineNumber":311,"author":{"gitId":"jyztintan"},"content":"| `* *` | forgetful user | get instructions on how to set up profiles and navigate | refresh my memory on how to use Realodex when needed |","lastModifiedDate":"2024-02-28"},{"lineNumber":312,"author":{"gitId":"jyztintan"},"content":"| `* *` | user with inactive clients | archive inactive clients | hide them from my active list while keeping their information for future reference |","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"jyztintan"},"content":"| `* ` | real estate agent user | be notified of upcoming client birthdays | send personalized greetings and strengthen my relationships |","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"jyztintan"},"content":"| `*` | real estate agent user | be notified of upcoming holidays | prepare gifts for my clients and enhance our relationship |","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"jyztintan"},"content":"| `*` | real estate agent user | be reminded of significant client milestones | acknowledge these events and further personalize our relationship |","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"jyztintan"},"content":"| `*` | tech-savvy user | use tab to autofill parts of my command | speed up my use of the command line |","lastModifiedDate":"2024-02-28"},{"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":"UdhayaShan1"},"content":"(For all use cases below, the **System** is the `Realodex` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"UdhayaShan1"},"content":"**Use case: Creating a user profile**","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"UdhayaShan1"},"content":"**Actor: User**","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"UdhayaShan1"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"UdhayaShan1"},"content":"1. User Executes \"Add client....\" Command:","lastModifiedDate":"2024-03-01"},{"lineNumber":330,"author":{"gitId":"UdhayaShan1"},"content":"2. System adds use profile to local storage and replies to user with success message.","lastModifiedDate":"2024-03-01"},{"lineNumber":331,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":332,"author":{"gitId":"UdhayaShan1"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":333,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":334,"author":{"gitId":"UdhayaShan1"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":335,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"UdhayaShan1"},"content":"* 1a. Name exceeds the length constraints.","lastModifiedDate":"2024-03-01"},{"lineNumber":337,"author":{"gitId":"UdhayaShan1"},"content":" * 1a1. Realodex throws an error and requests shorter name representation.","lastModifiedDate":"2024-03-01"},{"lineNumber":338,"author":{"gitId":"UdhayaShan1"},"content":" * 1a2. User enters new data. ","lastModifiedDate":"2024-03-01"},{"lineNumber":339,"author":{"gitId":"4llysa"},"content":" * Use case resumes from step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":341,"author":{"gitId":"UdhayaShan1"},"content":"* 1b. Name Length is not fully English.","lastModifiedDate":"2024-03-01"},{"lineNumber":342,"author":{"gitId":"UdhayaShan1"},"content":" * 1b1. Realodex throws an error and requests for only English input.","lastModifiedDate":"2024-03-01"},{"lineNumber":343,"author":{"gitId":"UdhayaShan1"},"content":" * 1b2. User enters new data. ","lastModifiedDate":"2024-03-01"},{"lineNumber":344,"author":{"gitId":"4llysa"},"content":" * Use case resumes from step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":346,"author":{"gitId":"UdhayaShan1"},"content":"* 1c. Name contains erraneous whitespace.","lastModifiedDate":"2024-03-01"},{"lineNumber":347,"author":{"gitId":"UdhayaShan1"},"content":" * 1c1. Realodex throws a warning and fixes this for user. ","lastModifiedDate":"2024-03-01"},{"lineNumber":348,"author":{"gitId":"4llysa"},"content":" * Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":350,"author":{"gitId":"UdhayaShan1"},"content":"* 1d. Name is not capitalized.","lastModifiedDate":"2024-03-01"},{"lineNumber":351,"author":{"gitId":"UdhayaShan1"},"content":" * 1d1. Realodex throws a warning and fixes this for user. ","lastModifiedDate":"2024-03-01"},{"lineNumber":352,"author":{"gitId":"4llysa"},"content":" * Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":354,"author":{"gitId":"UdhayaShan1"},"content":"* 1e. Name is not in expected format.","lastModifiedDate":"2024-03-01"},{"lineNumber":355,"author":{"gitId":"UdhayaShan1"},"content":" * 1e1. Realodex throws an error and highlights the format to user.","lastModifiedDate":"2024-03-01"},{"lineNumber":356,"author":{"gitId":"UdhayaShan1"},"content":" * 1e2. User enters new data. ","lastModifiedDate":"2024-03-01"},{"lineNumber":357,"author":{"gitId":"4llysa"},"content":" * Use case resumes from step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":359,"author":{"gitId":"UdhayaShan1"},"content":"* 1f. Address is not fully English ","lastModifiedDate":"2024-03-01"},{"lineNumber":360,"author":{"gitId":"UdhayaShan1"},"content":" * 1f1. Realodex throws an error and requests for only English input.","lastModifiedDate":"2024-03-01"},{"lineNumber":361,"author":{"gitId":"UdhayaShan1"},"content":" * 1f2. User enters new data. ","lastModifiedDate":"2024-03-01"},{"lineNumber":362,"author":{"gitId":"4llysa"},"content":" * Use case resumes from step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":364,"author":{"gitId":"UdhayaShan1"},"content":"* 1g. Address exceeds the length constraints","lastModifiedDate":"2024-03-01"},{"lineNumber":365,"author":{"gitId":"UdhayaShan1"},"content":" * 1g1. Realodex throws an error and requests shorter address representation.","lastModifiedDate":"2024-03-01"},{"lineNumber":366,"author":{"gitId":"UdhayaShan1"},"content":" * 1g2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":367,"author":{"gitId":"4llysa"},"content":" * Use case resumes from step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":369,"author":{"gitId":"UdhayaShan1"},"content":"* 1h. Address is not capitalized for each part.","lastModifiedDate":"2024-03-01"},{"lineNumber":370,"author":{"gitId":"UdhayaShan1"},"content":" * 1h1. Realodex throws a warning and fixes this for user. ","lastModifiedDate":"2024-03-01"},{"lineNumber":371,"author":{"gitId":"4llysa"},"content":" * Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":373,"author":{"gitId":"UdhayaShan1"},"content":"* 1i. Income is not in SGD","lastModifiedDate":"2024-03-01"},{"lineNumber":374,"author":{"gitId":"UdhayaShan1"},"content":" * 1i. Realodex throws an error and requests a SGD value.","lastModifiedDate":"2024-03-01"},{"lineNumber":375,"author":{"gitId":"UdhayaShan1"},"content":" * 1i2. User enters new data.","lastModifiedDate":"2024-03-01"},{"lineNumber":376,"author":{"gitId":"4llysa"},"content":" * Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":378,"author":{"gitId":"UdhayaShan1"},"content":"* 1j. Income is negative","lastModifiedDate":"2024-03-01"},{"lineNumber":379,"author":{"gitId":"UdhayaShan1"},"content":" * 1j1. Realodex throws an error and requests a positive income value.","lastModifiedDate":"2024-03-01"},{"lineNumber":380,"author":{"gitId":"UdhayaShan1"},"content":" * 1j2. User enters new data. ","lastModifiedDate":"2024-03-01"},{"lineNumber":381,"author":{"gitId":"4llysa"},"content":" * Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":383,"author":{"gitId":"UdhayaShan1"},"content":"* 1k. Additonal notes exceed length constraints.","lastModifiedDate":"2024-03-01"},{"lineNumber":384,"author":{"gitId":"UdhayaShan1"},"content":" * 1k1. Realodex throws an error and requests a shorter input.","lastModifiedDate":"2024-03-01"},{"lineNumber":385,"author":{"gitId":"UdhayaShan1"},"content":" * 1k2. User enters new data. ","lastModifiedDate":"2024-03-01"},{"lineNumber":386,"author":{"gitId":"4llysa"},"content":" * Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":388,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"UdhayaShan1"},"content":"1. User requests to delete user","lastModifiedDate":"2024-03-01"},{"lineNumber":393,"author":{"gitId":"UdhayaShan1"},"content":"2. Realodex deletes the person with success message","lastModifiedDate":"2024-03-01"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"wapisai"},"content":"* 2a. The input name is not found","lastModifiedDate":"2024-02-28"},{"lineNumber":400,"author":{"gitId":"UdhayaShan1"},"content":" * 2a1. Realodex shows an error message \"\u003cName\u003e is not found\". ","lastModifiedDate":"2024-03-01"},{"lineNumber":401,"author":{"gitId":"4llysa"},"content":" * Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"wapisai"},"content":"**Use case: List**","lastModifiedDate":"2024-02-28"},{"lineNumber":403,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":404,"author":{"gitId":"wapisai"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":405,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":406,"author":{"gitId":"wapisai"},"content":"1. User requests to list","lastModifiedDate":"2024-02-28"},{"lineNumber":407,"author":{"gitId":"wapisai"},"content":"2. Realodex shows the list of all clients","lastModifiedDate":"2024-02-28"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"wapisai"},"content":"* 2a. The list is empty","lastModifiedDate":"2024-02-28"},{"lineNumber":414,"author":{"gitId":"UdhayaShan1"},"content":" * 2a1. Realodex shows an empty list. ","lastModifiedDate":"2024-03-01"},{"lineNumber":415,"author":{"gitId":"4llysa"},"content":" * Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"wapisai"},"content":"**Use case: Find**","lastModifiedDate":"2024-02-28"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":419,"author":{"gitId":"wapisai"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":420,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":421,"author":{"gitId":"UdhayaShan1"},"content":"1. User requests to find user","lastModifiedDate":"2024-03-01"},{"lineNumber":422,"author":{"gitId":"UdhayaShan1"},"content":"2. Realodex shows the list of all clients with name including the name input","lastModifiedDate":"2024-03-01"},{"lineNumber":423,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":424,"author":{"gitId":"wapisai"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":426,"author":{"gitId":"wapisai"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":428,"author":{"gitId":"UdhayaShan1"},"content":"* 2a. No contact found with a name including the name input","lastModifiedDate":"2024-03-01"},{"lineNumber":429,"author":{"gitId":"UdhayaShan1"},"content":" * 2a1. Realodex shows an empty list. ","lastModifiedDate":"2024-03-01"},{"lineNumber":430,"author":{"gitId":"4llysa"},"content":" * Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"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":436,"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":437,"author":{"gitId":"4llysa"},"content":"3. A real estate agent 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-02-28"},{"lineNumber":438,"author":{"gitId":"4llysa"},"content":"4. Should be able to have up to 500 client profiles.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"4llysa"},"content":"5. The response to any command should become visible within 5 seconds.","lastModifiedDate":"2024-02-28"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":444,"author":{"gitId":"4llysa"},"content":"* **Client Profile**: Details of customer of the Real Esate Agent looking to buy / sell / rent a property","lastModifiedDate":"2024-02-28"},{"lineNumber":445,"author":{"gitId":"4llysa"},"content":"* **Command Line Interface (CLI)**: A text-based interface used to interact with the software by entering commands into a terminal or console window, typically preferred by users who prefer efficiency and automation.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":455,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":456,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"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":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"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":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"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":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"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":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"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":490,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"4llysa":19,"jyztintan":26,"-":374,"UdhayaShan1":63,"wapisai":18}},{"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":"appleraincoat"},"content":"# Realodex (RDX) User Guide","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"appleraincoat"},"content":"Realodex (or RDX for short) is a **desktop app for managing client contacts, optimized for use via a ","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"appleraincoat"},"content":"Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). ","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"appleraincoat"},"content":"If you can type fast, RDX can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-02-28"},{"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":"appleraincoat"},"content":"1. Ensure you have Java `11` or above installed in your computer.","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"appleraincoat"},"content":"1. Download the latest `realodex.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"appleraincoat"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your Realodex.","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"appleraincoat"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar realodex.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"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":"appleraincoat"},"content":"1. Some example commands you can try:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"appleraincoat"},"content":" * `add n/John Doe a/John street, block 123, #01-01 i/$5000 fs/4 an/Looking for a quiet neighbourhood.` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"appleraincoat"},"content":" * `delete John Doe` : Deletes the client with name `John Doe` from the current list.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","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":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"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":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"appleraincoat"},"content":" e.g. if the command specifies `n/NAME a/ADDRESS`, `a/ADDRESS n/NAME` is also acceptable.","lastModifiedDate":"2024-03-01"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":52,"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":53,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"appleraincoat"},"content":"### Adding a client: `add`","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"appleraincoat"},"content":"Adds a client to the Realodex.","lastModifiedDate":"2024-02-28"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"appleraincoat"},"content":"Format: `add n/NAME a/ADDRESS i/INCOME fs/FAMILY_SIZE an/ADDITIONAL_NOTES`","lastModifiedDate":"2024-03-01"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"appleraincoat"},"content":"* `add n/John Doe a/John street, block 123, #01-01 i/$5000 fs/4 an/Looking for a quiet neighbourhood.`","lastModifiedDate":"2024-03-01"},{"lineNumber":63,"author":{"gitId":"appleraincoat"},"content":"* `add n/Betsy Crowe a/Newgate Prison i/$0 fs/1 an/NIL.`","lastModifiedDate":"2024-03-01"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"appleraincoat"},"content":"### Deleting a client : `delete`","lastModifiedDate":"2024-02-28"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"appleraincoat"},"content":"Deletes the specified client from the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"appleraincoat"},"content":"Format: `delete NAME`","lastModifiedDate":"2024-03-01"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"appleraincoat"},"content":"enter client\u0027s `NAME` after prompt is shown","lastModifiedDate":"2024-03-01"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":73,"author":{"gitId":"appleraincoat"},"content":"* Deletes the client of the specified `NAME`.","lastModifiedDate":"2024-03-01"},{"lineNumber":74,"author":{"gitId":"appleraincoat"},"content":"* If name is **not found**, error message will be shown `\"NAME\" is not found`.","lastModifiedDate":"2024-03-01"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"appleraincoat"},"content":"* `delete` followed by `Udhaya Shanmugam` deletes the client in the address book with the name \"Udhaya Shanmugam.","lastModifiedDate":"2024-03-01"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"appleraincoat"},"content":"Realodex data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-02-28"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":91,"author":{"gitId":"appleraincoat"},"content":"Realodex data are saved automatically as a JSON file `[JAR file location]/data/realodex.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":93,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":95,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"appleraincoat"},"content":"If your changes to the data file makes its format invalid, Realodex 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-28"},{"lineNumber":97,"author":{"gitId":"appleraincoat"},"content":"Furthermore, certain edits can cause the Realodex 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":"2024-02-28"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":100,"author":{"gitId":"appleraincoat"},"content":"### Listing all clients `[coming in v1.2]`","lastModifiedDate":"2024-02-28"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"wapisai"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":105,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"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":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":116,"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":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":124,"author":{"gitId":"appleraincoat"},"content":"**Add** | `add n/NAME a/ADDRESS i/INCOME fs/FAMILY_SIZE an/ADDITIONAL_NOTES` \u003cbr\u003e e.g., `add n/John Doe a/John street, block 123, #01-01 i/$5000 fs/4 an/Looking for a quiet neighbourhood.`","lastModifiedDate":"2024-03-01"},{"lineNumber":125,"author":{"gitId":"appleraincoat"},"content":"**Delete** | `delete NAME`\u003cbr\u003e e.g., `delete John`","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"-":93,"appleraincoat":31,"wapisai":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":"4llysa"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eRealodex\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"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":{"4llysa":1,"-":66}},{"path":"docs/team/4llysa.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"4llysa"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"4llysa"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"4llysa"},"content":" title: \"Allysa Tan\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"4llysa"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"4llysa"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":9,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"4llysa"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"4llysa"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":14,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":15,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":16,"author":{"gitId":"4llysa"},"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-02-28"},{"lineNumber":17,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"4llysa"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"4llysa"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"4llysa"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"4llysa"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"4llysa"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"4llysa"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"4llysa"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"4llysa"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"4llysa"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"4llysa"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"4llysa"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"4llysa"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"4llysa"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"4llysa"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"4llysa"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"4llysa"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"4llysa"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"4llysa"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"4llysa"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"4llysa"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"4llysa"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"4llysa"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"4llysa"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"4llysa":46}},{"path":"docs/team/appleraincoat.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":"appleraincoat"},"content":" title: \"appleraincoat\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"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":"appleraincoat"},"content":"AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user ","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"appleraincoat"},"content":"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-28"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"appleraincoat"},"content":" * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed ","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"appleraincoat"},"content":" * by using the redo command.","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"appleraincoat"},"content":" * Justification: This feature improves the product significantly because a user can make mistakes in commands and the ","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"appleraincoat"},"content":" * app should provide a convenient way to rectify them.","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"appleraincoat"},"content":" * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth ","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"appleraincoat"},"content":" * analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"appleraincoat"},"content":" * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in ","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"appleraincoat"},"content":" * the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"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":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"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":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"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":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":40,"appleraincoat":11}},{"path":"docs/team/jyztintan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jyztintan"},"content":"\u003ch1 align\u003d\"center\"\u003eHello there 👋, I\u0027m Justin \u003c/h1\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"jyztintan"},"content":"\u003ch2 align\u003d\"center\"\u003eYear 2 Computer Science Undergraduate || Teaching Assistant \u003c/h2\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"jyztintan"},"content":"\u003ch3 align\u003d\"center\"\u003eNational University of Singapore, School of Computing \u003c/h3\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"jyztintan"},"content":"- 🧠 I’m currently learning 🤖 Machine Learning and AI, 📊 Algorithmic Design and Analysis and 💻 Software Engineering","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"jyztintan"},"content":"- 📫 Reach out to me at **justintanwk2001@gmail.com**","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"jyztintan"},"content":"- 💡 Teaching Assistant for ♾ Discrete Mathematics and 🐍 Python Programming Methodology","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"jyztintan"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"jyztintan"},"content":"\u003ch3 align\u003d\"left\"\u003eConnect with me:\u003c/h3\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"jyztintan"},"content":"\u003cp align\u003d\"left\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.linkedin.com/in/tan-wee-kian-justin/\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/linked-in-alt.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"adam pithewan\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"jyztintan"},"content":" \u003c!--","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://fb.com/adam pithen wala\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/facebook.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"adam pithen wala\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://instagram.com/_._.adam._\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/instagram.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"_._.adam._\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.hackerrank.com/adampithewan\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/hackerrank.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"adampithewan\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://twitter.com/adam_pithenwala\" target\u003d\"blank\"\u003e\u003cimg align\u003d\"center\"","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/twitter.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"adampithewan\" height\u003d\"30\" width\u003d\"40\" /\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"jyztintan"},"content":" --\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"jyztintan"},"content":"\u003c/p\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"jyztintan"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"jyztintan"},"content":"\u003ch3 align\u003d\"left\"\u003eLanguages and Tools:\u003c/h3\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"jyztintan"},"content":"\u003cp align\u003d\"left\"\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.python.org\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/python/python-original.svg\" alt\u003d\"python\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://pandas.pydata.org/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/2ae2a900d2f041da66e950e4d48052658d850630/icons/pandas/pandas-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"pandas\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.java.com\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/java/java-original.svg\" alt\u003d\"java\" width\u003d\"40\"","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"jyztintan"},"content":" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.cprogramming.com/\" target\u003d\"_blank\"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"jyztintan"},"content":" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/c/c-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"c\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.w3schools.com/cpp/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/cplusplus/cplusplus-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":50,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"cplusplus\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://flutter.dev\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":52,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/flutter/flutter-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":53,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"flutter\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://dart.dev\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/dart/dart-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"dart\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":57,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://firebase.google.com/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":58,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/firebase/firebase-plain.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"firebase\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":60,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.photoshop.com/en\" target\u003d\"_blank\"","lastModifiedDate":"2024-02-28"},{"lineNumber":61,"author":{"gitId":"jyztintan"},"content":" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/photoshop/photoshop-line.svg\" alt\u003d\"photoshop\"","lastModifiedDate":"2024-02-28"},{"lineNumber":62,"author":{"gitId":"jyztintan"},"content":" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":63,"author":{"gitId":"jyztintan"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":64,"author":{"gitId":"jyztintan"},"content":" \u003c!--","lastModifiedDate":"2024-02-28"},{"lineNumber":65,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://developer.android.com\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":66,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/android/android-original-wordmark.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":67,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"android\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":68,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://getbootstrap.com\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":69,"author":{"gitId":"jyztintan"},"content":" \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/bootstrap/bootstrap-plain-wordmark.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":70,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"bootstrap\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":71,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.w3schools.com/css/\" target\u003d\"_blank\"","lastModifiedDate":"2024-02-28"},{"lineNumber":72,"author":{"gitId":"jyztintan"},"content":" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/css3/css3-original-wordmark.svg\" alt\u003d\"css3\"","lastModifiedDate":"2024-02-28"},{"lineNumber":73,"author":{"gitId":"jyztintan"},"content":" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":74,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.w3.org/html/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":75,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/html5/html5-original-wordmark.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":76,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"html5\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":77,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.adobe.com/in/products/illustrator.html\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":78,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://www.vectorlogo.zone/logos/adobe_illustrator/adobe_illustrator-icon.svg\" alt\u003d\"illustrator\" width\u003d\"40\"","lastModifiedDate":"2024-02-28"},{"lineNumber":79,"author":{"gitId":"jyztintan"},"content":" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":80,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/JavaScript\" target\u003d\"_blank\"","lastModifiedDate":"2024-02-28"},{"lineNumber":81,"author":{"gitId":"jyztintan"},"content":" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/javascript/javascript-original.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":82,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"javascript\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":83,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://kotlinlang.org\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://www.vectorlogo.zone/logos/kotlinlang/kotlinlang-icon.svg\" alt\u003d\"kotlin\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":84,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://www.mysql.com/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/mysql/mysql-original-wordmark.svg\" alt\u003d\"mysql\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":85,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://nodejs.org\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/nodejs/nodejs-original-wordmark.svg\" alt\u003d\"nodejs\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":86,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://reactjs.org/\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":87,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/react/react-original-wordmark.svg\"","lastModifiedDate":"2024-02-28"},{"lineNumber":88,"author":{"gitId":"jyztintan"},"content":" alt\u003d\"react\" width\u003d\"40\" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":89,"author":{"gitId":"jyztintan"},"content":" \u003ca href\u003d\"https://sass-lang.com\" target\u003d\"_blank\" rel\u003d\"noreferrer\"\u003e \u003cimg","lastModifiedDate":"2024-02-28"},{"lineNumber":90,"author":{"gitId":"jyztintan"},"content":" src\u003d\"https://raw.githubusercontent.com/devicons/devicon/master/icons/sass/sass-original.svg\" alt\u003d\"sass\" width\u003d\"40\"","lastModifiedDate":"2024-02-28"},{"lineNumber":91,"author":{"gitId":"jyztintan"},"content":" height\u003d\"40\" /\u003e \u003c/a\u003e ","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"jyztintan"},"content":" --\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":93,"author":{"gitId":"jyztintan"},"content":"\u003c/p\u003e","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"jyztintan":93}},{"path":"docs/team/udhayashan1.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"UdhayaShan1"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"UdhayaShan1"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"UdhayaShan1"},"content":" title: \"Udhaya\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"UdhayaShan1"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"UdhayaShan1"},"content":"### Not complete and not accurate, copied straight from johndoe.md","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"UdhayaShan1"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":9,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"UdhayaShan1"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"UdhayaShan1"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":14,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":15,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":16,"author":{"gitId":"UdhayaShan1"},"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-02-28"},{"lineNumber":17,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"UdhayaShan1"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"UdhayaShan1"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"UdhayaShan1"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"UdhayaShan1"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"UdhayaShan1"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"UdhayaShan1"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"UdhayaShan1"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"UdhayaShan1"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"UdhayaShan1"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"UdhayaShan1"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"UdhayaShan1"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"UdhayaShan1"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"UdhayaShan1"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"UdhayaShan1"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"UdhayaShan1"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"UdhayaShan1"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"UdhayaShan1"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"UdhayaShan1"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"UdhayaShan1"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"UdhayaShan1"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"UdhayaShan1"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"UdhayaShan1"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"UdhayaShan1"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"UdhayaShan1":46}},{"path":"docs/team/wapisai.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"wapisai"},"content":" title: \"Alicia\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"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":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"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":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"-":45,"wapisai":1}}] diff --git a/AY2324S2-CS2103T-W10-1_tp_master/commits.json b/AY2324S2-CS2103T-W10-1_tp_master/commits.json index a6ce59d2..bc23a0a5 100644 --- a/AY2324S2-CS2103T-W10-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-W10-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"4llysa":[{"date":"2024-02-28","commitResults":[{"hash":"4edae23e8c0a40d27feed0c0952d3777d72e8160","isMergeCommit":false,"messageTitle":"Update aboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}},{"hash":"d56389db3f11b83be10d776c64ca444a967ff1ad","isMergeCommit":true,"messageTitle":"Merge pull request #23 from 4llysa/update-aboutus-allysa","messageBody":"Update AboutUs (allysa)","fileTypesAndContributionMap":{}},{"hash":"4ca21bc9822949aa7b61b8a5653357d141174b6f","isMergeCommit":true,"messageTitle":"Merge pull request #28 from jyztintan/update-aboutus-justin","messageBody":"Update AboutUs for Justin","fileTypesAndContributionMap":{}},{"hash":"453d7fe7a4d3702c4a8d9db42d8a591f576675ff","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"0cf42e805cfa7b6046ebe2e8724f4e6b0e1598b0","isMergeCommit":true,"messageTitle":"Merge pull request #43 from 4llysa/update-site-wide-settings","messageBody":"Update default.md","fileTypesAndContributionMap":{}},{"hash":"f5a2e60c73fb24855344ad7cac4928c65acef1b9","isMergeCommit":true,"messageTitle":"Merge pull request #40 from UdhayaShan1/update-readme-contents","messageBody":"Update README contents and workflow badge","fileTypesAndContributionMap":{}},{"hash":"c8346f21064326c8d0d7d821add856a36cde5e11","isMergeCommit":false,"messageTitle":"Update NFRs and Glossary of DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"36c106789d6a42e877559c606a12cf7604d3592e","isMergeCommit":true,"messageTitle":"Merge pull request #45 from wapisai/update-README","messageBody":"Update UG - delete clients","fileTypesAndContributionMap":{}},{"hash":"35b1766c3fa9383d16c708f5c9698831aad6115b","isMergeCommit":true,"messageTitle":"Merge pull request #47 from wapisai/update-DG","messageBody":"Update dg","fileTypesAndContributionMap":{}},{"hash":"1095137d69f94180aa20b2ceaee1a606c3c265fe","isMergeCommit":true,"messageTitle":"Merge pull request #51 from jyztintan/update-developer-guide","messageBody":"Update Developer Guide User Stories","fileTypesAndContributionMap":{}}]}],"jyztintan":[{"date":"2024-02-28","commitResults":[{"hash":"e0e586855e727aa8de7e7527f2a3099ea63eef41","isMergeCommit":false,"messageTitle":"Update AboutUs for Justin","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":4}}},{"hash":"232d028660e104ec37a515b3aa37e3b6ee4c2c26","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-aboutus-justin","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c9877934b4340aa9d223e3ff34216c677b691ede","isMergeCommit":false,"messageTitle":"Update Developer Guide for Realodex","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":11}}},{"hash":"4085c1766f7c3cc04799f6ba685b1ccf2cb9d4b3","isMergeCommit":false,"messageTitle":"Standardise phrasing for user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":21}}},{"hash":"1d0948b4e4a6f57f6e6ae89d494886f5d7d4db49","isMergeCommit":true,"messageTitle":"Merge pull request #53 from UdhayaShan1/update-dg-usecases","messageBody":"Update dg usecases","fileTypesAndContributionMap":{}}]},{"date":"2024-03-01","commitResults":[{"hash":"c217561e5624b4509017e562c465f6dfd28aefcd","isMergeCommit":false,"messageTitle":"Rename Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"UdhayaShan1":[{"date":"2024-02-28","commitResults":[{"hash":"8e6ebdbf049058130823694a735a3dc7603ab41b","isMergeCommit":false,"messageTitle":"Add Udhaya info to AboutUs and udhaya.md portfolio placeholder","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}},{"hash":"a5069b88f7d74dee8ed1045ca126ce2b65a0b9da","isMergeCommit":true,"messageTitle":"Merge pull request #24 from UdhayaShan1/update-aboutus-udhaya","messageBody":"Add Udhaya info to AboutUs and udhaya.md portfolio placeholder","fileTypesAndContributionMap":{}},{"hash":"da90efc15f144fda315bec4a4af3694933db554b","isMergeCommit":false,"messageTitle":"Fix portfolio link in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fd2bdcf4957e0df11346c8f8230b8149fc436dd4","isMergeCommit":true,"messageTitle":"Merge pull request #27 from UdhayaShan1/update-aboutus-udhaya","messageBody":"Fix portfolio link in AboutUs","fileTypesAndContributionMap":{}},{"hash":"7e4a4f9d37bfa45c493598618c6dced925b22504","isMergeCommit":false,"messageTitle":"Update README contents and workflow badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":6}}},{"hash":"acbafeb8234ebb1ef7a17f7a232b18bcf49b3c50","isMergeCommit":true,"messageTitle":"Merge pull request #42 from jyztintan/update-readme","messageBody":"Update UI image for Realodex","fileTypesAndContributionMap":{}},{"hash":"8daee56764ae7d3a7b5fa4ee27ed9e47942d0f81","isMergeCommit":false,"messageTitle":"Add user profile creation use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":92,"deletions":1}}},{"hash":"21b92a9d00de1ef8e084a8103b45312896072fce","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-dg-usecases","messageBody":"# Conflicts:\n#\tdocs/DeveloperGuide.md\n","fileTypesAndContributionMap":{}},{"hash":"b7e2e1c0cb7f2753619de1217a339b1425a0f438","isMergeCommit":false,"messageTitle":"Update wrong line in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}}]},{"date":"2024-03-01","commitResults":[{"hash":"a22ad5d1f05e7a5bb29da8cf4fcaea73da06763a","isMergeCommit":true,"messageTitle":"Merge pull request #59 from jyztintan/update-developer-guide","messageBody":"Rename Developer Guide","fileTypesAndContributionMap":{}},{"hash":"463e916dade6bdc56883e5e49c12b3c734d54309","isMergeCommit":true,"messageTitle":"Merge pull request #58 from jyztintan/update-gitignore","messageBody":"Update .gitignore to ignore bin and compiled class files","fileTypesAndContributionMap":{}},{"hash":"8264e553c8f15740b030c14c96bc4a048f4976ff","isMergeCommit":false,"messageTitle":"Update DG use cases according to new CLI constraint","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":90}}},{"hash":"2a91d3495689145b8af3f3d4626e81f3f7280075","isMergeCommit":false,"messageTitle":"Remove family size extension use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":10}}}]}],"appleraincoat":[{"date":"2024-02-28","commitResults":[{"hash":"82b7f440d5887937d69c12dfbbcb63a75276adb8","isMergeCommit":false,"messageTitle":"Add AboutUs information for appleraincoat","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"0efa042c823393bca5465d6f63bc26366ba21aee","isMergeCommit":false,"messageTitle":"Add AboutUS information for appleraincoat","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":11}}},{"hash":"04d3c9c69122b8a6025931c165475469b1e53936","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-AboutUs-James","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"d31985fb741f333a1296ad51863767205427130b","isMergeCommit":true,"messageTitle":"Merge pull request #26 from appleraincoat/Update-AboutUs-James","messageBody":"Update AboutUs (James)","fileTypesAndContributionMap":{}},{"hash":"5113c3ffddd221b260e59b13eeaf5d7524335f36","isMergeCommit":false,"messageTitle":"Update line wrapping","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":5}}},{"hash":"9d4a493f78304718a23fc9f1324f02be6d48b456","isMergeCommit":true,"messageTitle":"Merge pull request #30 from appleraincoat/Update-AboutUs-James","messageBody":"Update line wrapping","fileTypesAndContributionMap":{}},{"hash":"f0b10cd67188fd774ea06418259c3b905335fd7f","isMergeCommit":false,"messageTitle":"Edit the title to include our project name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}},{"hash":"af788c4c44fb4bd4e3a378d35619092f2a643ed5","isMergeCommit":false,"messageTitle":"Add the add command for adding clients and changed phrasing to suit the Realodex","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":107}}},{"hash":"c7d1e42b61c815d50d78f69d0d290232e548af2a","isMergeCommit":true,"messageTitle":"Merge pull request #54 from appleraincoat/Edit-UG-Add-Command","messageBody":"Add the add command for adding clients and changed phrasing to suit the Realodex","fileTypesAndContributionMap":{}}]},{"date":"2024-03-01","commitResults":[{"hash":"5775e65c7f41886f8d647c30be1f1479d064d4e6","isMergeCommit":false,"messageTitle":"Update the UserGuide by editing and removing wrong information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":29}}},{"hash":"e7c5b206172fcd8b60494b8c611cc123c6d223af","isMergeCommit":true,"messageTitle":"Merge pull request #63 from UdhayaShan1/update-dg-newconstraints","messageBody":"Update DG use cases according to new CLI constraint","fileTypesAndContributionMap":{}},{"hash":"0540d49eb41ee7318ff900484a48a6e49f683321","isMergeCommit":false,"messageTitle":"Fix a minor issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"5f249a547b10be1c7b102b32b854672fb76047bc","isMergeCommit":true,"messageTitle":"Merge pull request #62 from appleraincoat/Edit-UG-Add-Command-Again","messageBody":"Update the UserGuide by editing and removing wrong information","fileTypesAndContributionMap":{}},{"hash":"e86c3cc878725f96e1d5f96553053ce27be2ca50","isMergeCommit":true,"messageTitle":"Merge pull request #64 from UdhayaShan1/update-dg-newconstraints","messageBody":"Remove family size extension use case","fileTypesAndContributionMap":{}}]}],"wapisai":[{"date":"2024-02-28","commitResults":[{"hash":"20a3b1ca523aa119d33d6e1b777f95dcbb2111e3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":3}}},{"hash":"7e7227ea246d1ad54b4cd696b01a7bca9a189cb7","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-AboutUs-Alicia","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c80c7f4dd1fa86bb7a81c197f6dffce29238f58a","isMergeCommit":true,"messageTitle":"Merge pull request #29 from wapisai/update-AboutUs-Alicia","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"5eaa68df4fa703583b0333dad85f0f667bbfb66f","isMergeCommit":true,"messageTitle":"Merge pull request #39 from appleraincoat/Edit-README-Title","messageBody":"Edit the title to include our project name","fileTypesAndContributionMap":{}},{"hash":"dfff9ba769a80b131e583a7790f2d76ad7c03d87","isMergeCommit":true,"messageTitle":"Merge pull request #38 from wapisai/master","messageBody":"Add image","fileTypesAndContributionMap":{}},{"hash":"69ab9e12352a7082923abd58a678387719b510c8","isMergeCommit":false,"messageTitle":"Update UG - delete clients","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":0}}},{"hash":"45288286143d37a9d70fd93bd2411064ee7a6b0c","isMergeCommit":false,"messageTitle":"Update DG - product scope","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":1}}},{"hash":"f616fbff85eacd6e4924df7c976d72975b66590d","isMergeCommit":true,"messageTitle":"Merge pull request #48 from 4llysa/update-docs","messageBody":"Update Developer Guide NFRs and Glossary","fileTypesAndContributionMap":{}},{"hash":"6236c3b63d0837533e3f875cca1fd03c5f23f7c1","isMergeCommit":false,"messageTitle":"Update DG - Use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":11}}}]}]},"authorFileTypeContributionMap":{"4llysa":{"docs":55,"functional-code":0,"test-code":0},"jyztintan":{"docs":125,"functional-code":0,"test-code":0},"UdhayaShan1":{"docs":129,"functional-code":0,"test-code":0},"appleraincoat":{"docs":47,"functional-code":0,"test-code":0},"wapisai":{"docs":24,"functional-code":0,"test-code":0}},"authorContributionVariance":{"4llysa":448.0,"jyztintan":3532.9375,"UdhayaShan1":5078.8594,"appleraincoat":3361.9844,"wapisai":1471.75},"authorDisplayNameMap":{"4llysa":"CS2103T-W10-1 ALLY..YING","jyztintan":"CS2103T-W10-1 TAN ..STIN","UdhayaShan1":"CS2103T-W10-1 SHAN..HAYA","appleraincoat":"CS2103T-W10-1 LAU ..AMES","wapisai":"CS2103T-W10-1 ALIC..I QI"}} +{"authorDailyContributionsMap":{"4llysa":[{"date":"2024-02-28","commitResults":[{"hash":"4edae23e8c0a40d27feed0c0952d3777d72e8160","isMergeCommit":false,"messageTitle":"Update aboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}},{"hash":"d56389db3f11b83be10d776c64ca444a967ff1ad","isMergeCommit":true,"messageTitle":"Merge pull request #23 from 4llysa/update-aboutus-allysa","messageBody":"Update AboutUs (allysa)","fileTypesAndContributionMap":{}},{"hash":"4ca21bc9822949aa7b61b8a5653357d141174b6f","isMergeCommit":true,"messageTitle":"Merge pull request #28 from jyztintan/update-aboutus-justin","messageBody":"Update AboutUs for Justin","fileTypesAndContributionMap":{}},{"hash":"453d7fe7a4d3702c4a8d9db42d8a591f576675ff","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"0cf42e805cfa7b6046ebe2e8724f4e6b0e1598b0","isMergeCommit":true,"messageTitle":"Merge pull request #43 from 4llysa/update-site-wide-settings","messageBody":"Update default.md","fileTypesAndContributionMap":{}},{"hash":"f5a2e60c73fb24855344ad7cac4928c65acef1b9","isMergeCommit":true,"messageTitle":"Merge pull request #40 from UdhayaShan1/update-readme-contents","messageBody":"Update README contents and workflow badge","fileTypesAndContributionMap":{}},{"hash":"c8346f21064326c8d0d7d821add856a36cde5e11","isMergeCommit":false,"messageTitle":"Update NFRs and Glossary of DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"36c106789d6a42e877559c606a12cf7604d3592e","isMergeCommit":true,"messageTitle":"Merge pull request #45 from wapisai/update-README","messageBody":"Update UG - delete clients","fileTypesAndContributionMap":{}},{"hash":"35b1766c3fa9383d16c708f5c9698831aad6115b","isMergeCommit":true,"messageTitle":"Merge pull request #47 from wapisai/update-DG","messageBody":"Update dg","fileTypesAndContributionMap":{}},{"hash":"1095137d69f94180aa20b2ceaee1a606c3c265fe","isMergeCommit":true,"messageTitle":"Merge pull request #51 from jyztintan/update-developer-guide","messageBody":"Update Developer Guide User Stories","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"17e1776bcc7824c850dc4a531972d9d6eb13b22b","isMergeCommit":false,"messageTitle":"Standardise resumption of use case in use case extensions","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":13}}},{"hash":"c5243d3a286876a70e712ecf92ae2ad70bc634b1","isMergeCommit":false,"messageTitle":"Update Glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"23ac757fd671567c5529ed6c136644e41ea00c6e","isMergeCommit":false,"messageTitle":"Update Dg","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":3}}}]}],"jyztintan":[{"date":"2024-02-28","commitResults":[{"hash":"e0e586855e727aa8de7e7527f2a3099ea63eef41","isMergeCommit":false,"messageTitle":"Update AboutUs for Justin","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":4}}},{"hash":"232d028660e104ec37a515b3aa37e3b6ee4c2c26","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-aboutus-justin","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c9877934b4340aa9d223e3ff34216c677b691ede","isMergeCommit":false,"messageTitle":"Update Developer Guide for Realodex","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":11}}},{"hash":"4085c1766f7c3cc04799f6ba685b1ccf2cb9d4b3","isMergeCommit":false,"messageTitle":"Standardise phrasing for user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":21}}},{"hash":"1d0948b4e4a6f57f6e6ae89d494886f5d7d4db49","isMergeCommit":true,"messageTitle":"Merge pull request #53 from UdhayaShan1/update-dg-usecases","messageBody":"Update dg usecases","fileTypesAndContributionMap":{}}]},{"date":"2024-03-01","commitResults":[{"hash":"c217561e5624b4509017e562c465f6dfd28aefcd","isMergeCommit":false,"messageTitle":"Rename Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"UdhayaShan1":[{"date":"2024-02-28","commitResults":[{"hash":"8e6ebdbf049058130823694a735a3dc7603ab41b","isMergeCommit":false,"messageTitle":"Add Udhaya info to AboutUs and udhaya.md portfolio placeholder","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}},{"hash":"a5069b88f7d74dee8ed1045ca126ce2b65a0b9da","isMergeCommit":true,"messageTitle":"Merge pull request #24 from UdhayaShan1/update-aboutus-udhaya","messageBody":"Add Udhaya info to AboutUs and udhaya.md portfolio placeholder","fileTypesAndContributionMap":{}},{"hash":"da90efc15f144fda315bec4a4af3694933db554b","isMergeCommit":false,"messageTitle":"Fix portfolio link in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fd2bdcf4957e0df11346c8f8230b8149fc436dd4","isMergeCommit":true,"messageTitle":"Merge pull request #27 from UdhayaShan1/update-aboutus-udhaya","messageBody":"Fix portfolio link in AboutUs","fileTypesAndContributionMap":{}},{"hash":"7e4a4f9d37bfa45c493598618c6dced925b22504","isMergeCommit":false,"messageTitle":"Update README contents and workflow badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":6}}},{"hash":"acbafeb8234ebb1ef7a17f7a232b18bcf49b3c50","isMergeCommit":true,"messageTitle":"Merge pull request #42 from jyztintan/update-readme","messageBody":"Update UI image for Realodex","fileTypesAndContributionMap":{}},{"hash":"8daee56764ae7d3a7b5fa4ee27ed9e47942d0f81","isMergeCommit":false,"messageTitle":"Add user profile creation use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":92,"deletions":1}}},{"hash":"21b92a9d00de1ef8e084a8103b45312896072fce","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-dg-usecases","messageBody":"# Conflicts:\n#\tdocs/DeveloperGuide.md\n","fileTypesAndContributionMap":{}},{"hash":"b7e2e1c0cb7f2753619de1217a339b1425a0f438","isMergeCommit":false,"messageTitle":"Update wrong line in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}}]},{"date":"2024-03-01","commitResults":[{"hash":"a22ad5d1f05e7a5bb29da8cf4fcaea73da06763a","isMergeCommit":true,"messageTitle":"Merge pull request #59 from jyztintan/update-developer-guide","messageBody":"Rename Developer Guide","fileTypesAndContributionMap":{}},{"hash":"463e916dade6bdc56883e5e49c12b3c734d54309","isMergeCommit":true,"messageTitle":"Merge pull request #58 from jyztintan/update-gitignore","messageBody":"Update .gitignore to ignore bin and compiled class files","fileTypesAndContributionMap":{}},{"hash":"8264e553c8f15740b030c14c96bc4a048f4976ff","isMergeCommit":false,"messageTitle":"Update DG use cases according to new CLI constraint","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":90}}},{"hash":"2a91d3495689145b8af3f3d4626e81f3f7280075","isMergeCommit":false,"messageTitle":"Remove family size extension use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":10}}}]},{"date":"2024-03-08","commitResults":[{"hash":"e4e07dd9ff47535f101f32078bc4478ef877bc66","isMergeCommit":true,"messageTitle":"Merge pull request #65 from 4llysa/fix-dg-formatting","messageBody":"Fix dg formatting","fileTypesAndContributionMap":{}}]}],"appleraincoat":[{"date":"2024-02-28","commitResults":[{"hash":"82b7f440d5887937d69c12dfbbcb63a75276adb8","isMergeCommit":false,"messageTitle":"Add AboutUs information for appleraincoat","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"0efa042c823393bca5465d6f63bc26366ba21aee","isMergeCommit":false,"messageTitle":"Add AboutUS information for appleraincoat","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":11}}},{"hash":"04d3c9c69122b8a6025931c165475469b1e53936","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-AboutUs-James","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"d31985fb741f333a1296ad51863767205427130b","isMergeCommit":true,"messageTitle":"Merge pull request #26 from appleraincoat/Update-AboutUs-James","messageBody":"Update AboutUs (James)","fileTypesAndContributionMap":{}},{"hash":"5113c3ffddd221b260e59b13eeaf5d7524335f36","isMergeCommit":false,"messageTitle":"Update line wrapping","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":5}}},{"hash":"9d4a493f78304718a23fc9f1324f02be6d48b456","isMergeCommit":true,"messageTitle":"Merge pull request #30 from appleraincoat/Update-AboutUs-James","messageBody":"Update line wrapping","fileTypesAndContributionMap":{}},{"hash":"f0b10cd67188fd774ea06418259c3b905335fd7f","isMergeCommit":false,"messageTitle":"Edit the title to include our project name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}},{"hash":"af788c4c44fb4bd4e3a378d35619092f2a643ed5","isMergeCommit":false,"messageTitle":"Add the add command for adding clients and changed phrasing to suit the Realodex","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":107}}},{"hash":"c7d1e42b61c815d50d78f69d0d290232e548af2a","isMergeCommit":true,"messageTitle":"Merge pull request #54 from appleraincoat/Edit-UG-Add-Command","messageBody":"Add the add command for adding clients and changed phrasing to suit the Realodex","fileTypesAndContributionMap":{}}]},{"date":"2024-03-01","commitResults":[{"hash":"5775e65c7f41886f8d647c30be1f1479d064d4e6","isMergeCommit":false,"messageTitle":"Update the UserGuide by editing and removing wrong information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":29}}},{"hash":"e7c5b206172fcd8b60494b8c611cc123c6d223af","isMergeCommit":true,"messageTitle":"Merge pull request #63 from UdhayaShan1/update-dg-newconstraints","messageBody":"Update DG use cases according to new CLI constraint","fileTypesAndContributionMap":{}},{"hash":"0540d49eb41ee7318ff900484a48a6e49f683321","isMergeCommit":false,"messageTitle":"Fix a minor issue","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"5f249a547b10be1c7b102b32b854672fb76047bc","isMergeCommit":true,"messageTitle":"Merge pull request #62 from appleraincoat/Edit-UG-Add-Command-Again","messageBody":"Update the UserGuide by editing and removing wrong information","fileTypesAndContributionMap":{}},{"hash":"e86c3cc878725f96e1d5f96553053ce27be2ca50","isMergeCommit":true,"messageTitle":"Merge pull request #64 from UdhayaShan1/update-dg-newconstraints","messageBody":"Remove family size extension use case","fileTypesAndContributionMap":{}}]}],"wapisai":[{"date":"2024-02-28","commitResults":[{"hash":"20a3b1ca523aa119d33d6e1b777f95dcbb2111e3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":3}}},{"hash":"7e7227ea246d1ad54b4cd696b01a7bca9a189cb7","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-AboutUs-Alicia","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c80c7f4dd1fa86bb7a81c197f6dffce29238f58a","isMergeCommit":true,"messageTitle":"Merge pull request #29 from wapisai/update-AboutUs-Alicia","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"5eaa68df4fa703583b0333dad85f0f667bbfb66f","isMergeCommit":true,"messageTitle":"Merge pull request #39 from appleraincoat/Edit-README-Title","messageBody":"Edit the title to include our project name","fileTypesAndContributionMap":{}},{"hash":"dfff9ba769a80b131e583a7790f2d76ad7c03d87","isMergeCommit":true,"messageTitle":"Merge pull request #38 from wapisai/master","messageBody":"Add image","fileTypesAndContributionMap":{}},{"hash":"69ab9e12352a7082923abd58a678387719b510c8","isMergeCommit":false,"messageTitle":"Update UG - delete clients","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":0}}},{"hash":"45288286143d37a9d70fd93bd2411064ee7a6b0c","isMergeCommit":false,"messageTitle":"Update DG - product scope","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":1}}},{"hash":"f616fbff85eacd6e4924df7c976d72975b66590d","isMergeCommit":true,"messageTitle":"Merge pull request #48 from 4llysa/update-docs","messageBody":"Update Developer Guide NFRs and Glossary","fileTypesAndContributionMap":{}},{"hash":"6236c3b63d0837533e3f875cca1fd03c5f23f7c1","isMergeCommit":false,"messageTitle":"Update DG - Use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":11}}}]}]},"authorFileTypeContributionMap":{"4llysa":{"docs":70,"functional-code":0,"test-code":0},"jyztintan":{"docs":125,"functional-code":0,"test-code":0},"UdhayaShan1":{"docs":127,"functional-code":0,"test-code":0},"appleraincoat":{"docs":47,"functional-code":0,"test-code":0},"wapisai":{"docs":23,"functional-code":0,"test-code":0}},"authorContributionVariance":{"4llysa":350.29337,"jyztintan":2013.0493,"UdhayaShan1":3129.6616,"appleraincoat":1982.995,"wapisai":837.26245},"authorDisplayNameMap":{"4llysa":"CS2103T-W10-1 ALLY..YING","jyztintan":"CS2103T-W10-1 TAN ..STIN","UdhayaShan1":"CS2103T-W10-1 SHAN..HAYA","appleraincoat":"CS2103T-W10-1 LAU ..AMES","wapisai":"CS2103T-W10-1 ALIC..I QI"}} diff --git a/AY2324S2-CS2103T-W10-3_tp_master/authorship.json b/AY2324S2-CS2103T-W10-3_tp_master/authorship.json index 9343bb75..25016071 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-02-28"},{"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"}],"authorContributionMap":{"wallacexuhanxiao":5,"ongzhili":5,"-":34,"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/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":"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}}] diff --git a/AY2324S2-CS2103T-W10-3_tp_master/commits.json b/AY2324S2-CS2103T-W10-3_tp_master/commits.json index 133bfbe4..b4390bd3 100644 --- a/AY2324S2-CS2103T-W10-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-W10-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"IamZhenHong":[],"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":{}}]}],"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":{}}]}],"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":0,"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":0.0,"ongzhili":211.78062,"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":{}}]}],"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"}} diff --git a/AY2324S2-CS2103T-W13-1_tp_master/authorship.json b/AY2324S2-CS2103T-W13-1_tp_master/authorship.json index ab1864e6..67a31509 100644 --- a/AY2324S2-CS2103T-W13-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W13-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kjw142857"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W13-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W13-1/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W13-1/tp/graph/badge.svg?token\u003dMZAGQZIFNS)](https://codecov.io/gh/AY2324S2-CS2103T-W13-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":"kjw142857"},"content":"* This is **LoanGuard Pro, an application that helps business owners manage clients and their loan details**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"kjw142857"},"content":" * to keep track of the items you have loaned out","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"kjw142857"},"content":" * to view your history of loans by client","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"kjw142857"},"content":"* The project builds on an existing Address Book used for managing contact details, **adding in a loan tracker functionality**.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"kjw142857"},"content":" * It is **written in OOP fashion**.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kjw142857"},"content":"* It is named `LoanGuard Pro` because it represents a more powerful version of an address book, that can also manage the loans of your contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"kjw142857"},"content":"* For the detailed documentation of this project, see the **[LoanGuard Pro Product Website](https://ay2324s2-cs2103t-w13-1.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"kjw142857"},"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":{"kjw142857":9,"-":7}},{"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":"kjw142857"},"content":"### Khor Jun Wei","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kjw142857"},"content":"\u003cimg src\u003d\"images/kjw142857.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kjw142857"},"content":"[[github](https://github.com/kjw142857)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kjw142857"},"content":"[[portfolio](https://github.com/kjw142857)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"kjw142857"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"kjw142857"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"marcus-ny"},"content":"### Kyal Sin Min Thet","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"marcus-ny"},"content":"\u003cimg src\u003d\"images/marcus-ny.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"marcus-ny"},"content":"[[github](http://github.com/marcus-ny)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"marcus-ny"},"content":"[[portfolio](http://github.com/marcus-ny)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"marcus-ny"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"marcus-ny"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Joseph31416"},"content":"### Teoh Tze Tzun","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Joseph31416"},"content":"\u003cimg src\u003d\"images/joseph31416.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Joseph31416"},"content":"[[github](https://github.com/Joseph31416)] [[portfolio](https://github.com/Joseph31416)]","lastModifiedDate":"2024-03-06"},{"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":"narwhalsilent"},"content":"### Wang Junwu","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"narwhalsilent"},"content":"\u003cimg src\u003d\"images/narwhalsilent.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"narwhalsilent"},"content":"[[github](http://github.com/narwhalsilent)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"narwhalsilent"},"content":"[[portfolio](http://github.com/narwhalsilent)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"narwhalsilent"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":{"marcus-ny":6,"Joseph31416":3,"-":39,"kjw142857":6,"narwhalsilent":5}},{"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":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"marcus-ny"},"content":" original source as well}","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"marcus-ny"},"content":"_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"marcus-ny"},"content":"and edit diagrams.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"marcus-ny"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"marcus-ny"},"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":46,"author":{"gitId":"marcus-ny"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":63,"author":{"gitId":"marcus-ny"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":71,"author":{"gitId":"marcus-ny"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-07"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"marcus-ny"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-07"},{"lineNumber":74,"author":{"gitId":"marcus-ny"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-07"},{"lineNumber":75,"author":{"gitId":"marcus-ny"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-07"},{"lineNumber":76,"author":{"gitId":"marcus-ny"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":85,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-07"},{"lineNumber":90,"author":{"gitId":"marcus-ny"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-07"},{"lineNumber":91,"author":{"gitId":"marcus-ny"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-07"},{"lineNumber":92,"author":{"gitId":"marcus-ny"},"content":"visible GUI.","lastModifiedDate":"2024-03-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"marcus-ny"},"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":95,"author":{"gitId":"marcus-ny"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"marcus-ny"},"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":97,"author":{"gitId":"marcus-ny"},"content":"is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":98,"author":{"gitId":"marcus-ny"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":110,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"marcus-ny"},"content":"call as an example.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":127,"author":{"gitId":"marcus-ny"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":128,"author":{"gitId":"marcus-ny"},"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":129,"author":{"gitId":"marcus-ny"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":132,"author":{"gitId":"marcus-ny"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"marcus-ny"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"marcus-ny"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"marcus-ny"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"marcus-ny"},"content":" a `Command` object.","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"marcus-ny"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"marcus-ny"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"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":160,"author":{"gitId":"marcus-ny"},"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":161,"author":{"gitId":"marcus-ny"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"marcus-ny"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"marcus-ny"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"marcus-ny"},"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":165,"author":{"gitId":"marcus-ny"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"marcus-ny"},"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":183,"author":{"gitId":"marcus-ny"},"content":" objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":184,"author":{"gitId":"marcus-ny"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"marcus-ny"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"marcus-ny"},"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":187,"author":{"gitId":"marcus-ny"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-07"},{"lineNumber":204,"author":{"gitId":"marcus-ny"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-07"},{"lineNumber":205,"author":{"gitId":"marcus-ny"},"content":"following operations:","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#commit()`— Saves the current address book state in its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":208,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#undo()`— Restores the previous address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":209,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#redo()`— Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"marcus-ny"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-07"},{"lineNumber":212,"author":{"gitId":"marcus-ny"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-07"},{"lineNumber":217,"author":{"gitId":"marcus-ny"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":222,"author":{"gitId":"marcus-ny"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-07"},{"lineNumber":223,"author":{"gitId":"marcus-ny"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"marcus-ny"},"content":"state.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-07"},{"lineNumber":229,"author":{"gitId":"marcus-ny"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-07"},{"lineNumber":230,"author":{"gitId":"marcus-ny"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":239,"author":{"gitId":"marcus-ny"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-07"},{"lineNumber":240,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once","lastModifiedDate":"2024-03-07"},{"lineNumber":262,"author":{"gitId":"marcus-ny"},"content":"to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":269,"author":{"gitId":"marcus-ny"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-07"},{"lineNumber":270,"author":{"gitId":"marcus-ny"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-07"},{"lineNumber":275,"author":{"gitId":"marcus-ny"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-07"},{"lineNumber":276,"author":{"gitId":"marcus-ny"},"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":277,"author":{"gitId":"marcus-ny"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-07"},{"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":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"marcus-ny"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"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":341,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"marcus-ny"},"content":"(For all use cases below, the **System** is the `LoanGuard Pro` and the **Actor** is the `user`, unless specified","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"marcus-ny"},"content":"otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC1 - Delete a contact","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"marcus-ny"},"content":"Precondition: `list` command shows a numbered list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"marcus-ny"},"content":"1. User requests to delete a contact, specifying the index.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"marcus-ny"},"content":"2. System deletes the contact from the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"marcus-ny"},"content":"3. System shows the contact that was deleted in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size) ","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC2 - Find a person by name","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"marcus-ny"},"content":"1. User searches for a contact with desired prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"marcus-ny"},"content":"2. System shows the list of contacts that match the prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"marcus-ny"},"content":"1a. User searches for a contact using an empty prompt. ","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"marcus-ny"},"content":"1a. No contact matches the prompt. ","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows a message in the status message that no contact matches the prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC3 - Link a loan to contact","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"marcus-ny"},"content":"1. User links a contact with a loan, specifying the contact name and loan details.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"marcus-ny"},"content":"2. System links the loan to the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"marcus-ny"},"content":"3. System shows the contact and the loan that was linked successfully in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"marcus-ny"},"content":"1a. Contact does not exist in the address book. ","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that no contact with the name exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"marcus-ny"},"content":"1a. Loan details are invalid (e.g. empty, incomplete, wrong format). ","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the loan details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"marcus-ny"},"content":"1a. Multiple contacts with the same name exist. ","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows list of contacts with the same name and asks user to choose one by index. ","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"marcus-ny"},"content":"1a2. User chooses a contact by index. ","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"marcus-ny"},"content":"1a3. System links the loan to the chosen contact. ","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"marcus-ny"},"content":"1a4. System shows the contact and the loan that was linked successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC4 - View all loans linked to particular contact","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"marcus-ny"},"content":"1. User requests to view all loans linked to a particular contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"marcus-ny"},"content":"2. System shows the list of loans linked to the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"marcus-ny"},"content":"1a. Contact name does not exist in the address book. ","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that no contact with the name exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"marcus-ny"},"content":"1a. Multiple contacts with the same name exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows list of contacts with the same name and asks user to choose one by index.","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"marcus-ny"},"content":"1a2. User chooses a contact by index.","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"marcus-ny"},"content":"1a3. System shows the list of loans linked to the chosen contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC5 - Clear a loan from contact","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"marcus-ny"},"content":"1. User \u003cu\u003eviews all loans linked to the contact (UC4)\u003c/u\u003e.","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"marcus-ny"},"content":"2. User issues `clear` command with the name of contact and the index of loan to be cleared.","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"marcus-ny"},"content":"3. System clears the loan from the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"marcus-ny"},"content":"4. System shows the contact and the loan that was cleared successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size)","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the index is invalid. ","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC6 - Mark a loan as returned","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"marcus-ny"},"content":"1. User \u003cu\u003eviews all loans linked to the contact (UC4)\u003c/u\u003e.","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"marcus-ny"},"content":"2. User marks a loan as returned specifying contact name and loan index.","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"marcus-ny"},"content":"3. System marks the loan as returned.","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"marcus-ny"},"content":"4. System shows the contact and the loan that was marked as returned successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size) ","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the index is invalid. ","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"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":467,"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":468,"author":{"gitId":"marcus-ny"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"marcus-ny"},"content":" able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"marcus-ny"},"content":"4. Should be able to handle up to 100 active (not archived) loans per contact without a noticeable sluggishness in","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"marcus-ny"},"content":" performance for typical","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"marcus-ny"},"content":" usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"marcus-ny"},"content":"5. Returned loans should be archived instead of deleted for future reference.","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"marcus-ny"},"content":"6. The archived data should be stored for at least 3 years.","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"marcus-ny"},"content":"7. Should be able to support multiple user sessions with password authentication on the same device.","lastModifiedDate":"2024-03-07"},{"lineNumber":476,"author":{"gitId":"marcus-ny"},"content":"8. Archived data should be encrypted and only accessible by authorized users (admin and the user who created the data).","lastModifiedDate":"2024-03-07"},{"lineNumber":477,"author":{"gitId":"marcus-ny"},"content":"9. Loan amounts should be in a single currency (e.g. USD, SGD, EUR, etc.) and should be formatted as per the currency","lastModifiedDate":"2024-03-07"},{"lineNumber":478,"author":{"gitId":"marcus-ny"},"content":" standards.","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"marcus-ny"},"content":"10. Loan deadlines should not be more than 100 years from the date of loan creation.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":484,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"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":493,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"marcus-ny"},"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":504,"author":{"gitId":"marcus-ny"},"content":" optimum.","lastModifiedDate":"2024-03-07"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"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":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"marcus-ny"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":523,"author":{"gitId":"marcus-ny"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-07"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"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":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"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":529,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"marcus-ny":211,"-":328}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kjw142857"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W13-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W13-1/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W13-1/tp/graph/badge.svg?token\u003dMZAGQZIFNS)](https://codecov.io/gh/AY2324S2-CS2103T-W13-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":"kjw142857"},"content":"* This is **LoanGuard Pro, an application that helps business owners manage clients and their loan details**.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"kjw142857"},"content":" * to keep track of the items you have loaned out","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"kjw142857"},"content":" * to view your history of loans by client","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"kjw142857"},"content":"* The project builds on an existing Address Book used for managing contact details, **adding in a loan tracker functionality**.","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"kjw142857"},"content":" * It is **written in OOP fashion**.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kjw142857"},"content":"* It is named `LoanGuard Pro` because it represents a more powerful version of an address book, that can also manage the loans of your contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"kjw142857"},"content":"* For the detailed documentation of this project, see the **[LoanGuard Pro Product Website](https://ay2324s2-cs2103t-w13-1.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"kjw142857"},"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":{"kjw142857":9,"-":7}},{"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":"kjw142857"},"content":"### Khor Jun Wei","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kjw142857"},"content":"\u003cimg src\u003d\"images/kjw142857.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kjw142857"},"content":"[[github](https://github.com/kjw142857)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kjw142857"},"content":"[[portfolio](https://github.com/kjw142857)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"kjw142857"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"kjw142857"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"marcus-ny"},"content":"### Kyal Sin Min Thet","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"marcus-ny"},"content":"\u003cimg src\u003d\"images/marcus-ny.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"marcus-ny"},"content":"[[github](http://github.com/marcus-ny)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"marcus-ny"},"content":"[[portfolio](http://github.com/marcus-ny)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"marcus-ny"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"marcus-ny"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Joseph31416"},"content":"### Teoh Tze Tzun","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Joseph31416"},"content":"\u003cimg src\u003d\"images/joseph31416.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Joseph31416"},"content":"[[github](https://github.com/Joseph31416)] [[portfolio](https://github.com/Joseph31416)]","lastModifiedDate":"2024-03-06"},{"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":"narwhalsilent"},"content":"### Wang Junwu","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"narwhalsilent"},"content":"\u003cimg src\u003d\"images/narwhalsilent.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"narwhalsilent"},"content":"[[github](http://github.com/narwhalsilent)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"narwhalsilent"},"content":"[[portfolio](http://github.com/narwhalsilent)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"narwhalsilent"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"xiaorui-ui"},"content":"### Zhang Xiaorui","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"xiaorui-ui"},"content":"\u003cimg src\u003d\"images/xiaorui-ui.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"xiaorui-ui"},"content":"[[github](https://github.com/xiaorui-ui)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"xiaorui-ui"},"content":"[[portfolio](https://github.com/xiaorui-ui)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"xiaorui-ui"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"marcus-ny":6,"xiaorui-ui":5,"Joseph31416":3,"-":34,"kjw142857":6,"narwhalsilent":5}},{"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":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"marcus-ny"},"content":" original source as well}","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"marcus-ny"},"content":"_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"marcus-ny"},"content":"and edit diagrams.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"marcus-ny"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"marcus-ny"},"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":46,"author":{"gitId":"marcus-ny"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":63,"author":{"gitId":"marcus-ny"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":71,"author":{"gitId":"marcus-ny"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-07"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"marcus-ny"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-07"},{"lineNumber":74,"author":{"gitId":"marcus-ny"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-07"},{"lineNumber":75,"author":{"gitId":"marcus-ny"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-07"},{"lineNumber":76,"author":{"gitId":"marcus-ny"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":85,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-07"},{"lineNumber":90,"author":{"gitId":"marcus-ny"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-07"},{"lineNumber":91,"author":{"gitId":"marcus-ny"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-07"},{"lineNumber":92,"author":{"gitId":"marcus-ny"},"content":"visible GUI.","lastModifiedDate":"2024-03-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"marcus-ny"},"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":95,"author":{"gitId":"marcus-ny"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"marcus-ny"},"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":97,"author":{"gitId":"marcus-ny"},"content":"is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":98,"author":{"gitId":"marcus-ny"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":110,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"marcus-ny"},"content":"call as an example.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":127,"author":{"gitId":"marcus-ny"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":128,"author":{"gitId":"marcus-ny"},"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":129,"author":{"gitId":"marcus-ny"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":132,"author":{"gitId":"marcus-ny"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"marcus-ny"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"marcus-ny"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"marcus-ny"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"marcus-ny"},"content":" a `Command` object.","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"marcus-ny"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"marcus-ny"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-07"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"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":160,"author":{"gitId":"marcus-ny"},"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":161,"author":{"gitId":"marcus-ny"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"marcus-ny"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"marcus-ny"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"marcus-ny"},"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":165,"author":{"gitId":"marcus-ny"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":176,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":182,"author":{"gitId":"marcus-ny"},"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":183,"author":{"gitId":"marcus-ny"},"content":" objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":184,"author":{"gitId":"marcus-ny"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"marcus-ny"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"marcus-ny"},"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":187,"author":{"gitId":"marcus-ny"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-07"},{"lineNumber":204,"author":{"gitId":"marcus-ny"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-07"},{"lineNumber":205,"author":{"gitId":"marcus-ny"},"content":"following operations:","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#commit()`— Saves the current address book state in its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":208,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#undo()`— Restores the previous address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":209,"author":{"gitId":"marcus-ny"},"content":"* `VersionedAddressBook#redo()`— Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"marcus-ny"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-07"},{"lineNumber":212,"author":{"gitId":"marcus-ny"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-07"},{"lineNumber":217,"author":{"gitId":"marcus-ny"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":222,"author":{"gitId":"marcus-ny"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-07"},{"lineNumber":223,"author":{"gitId":"marcus-ny"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-07"},{"lineNumber":224,"author":{"gitId":"marcus-ny"},"content":"state.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-07"},{"lineNumber":229,"author":{"gitId":"marcus-ny"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-07"},{"lineNumber":230,"author":{"gitId":"marcus-ny"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":239,"author":{"gitId":"marcus-ny"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-07"},{"lineNumber":240,"author":{"gitId":"marcus-ny"},"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":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":"marcus-ny"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once","lastModifiedDate":"2024-03-07"},{"lineNumber":262,"author":{"gitId":"marcus-ny"},"content":"to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"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":269,"author":{"gitId":"marcus-ny"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-07"},{"lineNumber":270,"author":{"gitId":"marcus-ny"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-07"},{"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":"marcus-ny"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-07"},{"lineNumber":275,"author":{"gitId":"marcus-ny"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-07"},{"lineNumber":276,"author":{"gitId":"marcus-ny"},"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":277,"author":{"gitId":"marcus-ny"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-07"},{"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":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"marcus-ny"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"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":341,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"marcus-ny"},"content":"(For all use cases below, the **System** is the `LoanGuard Pro` and the **Actor** is the `user`, unless specified","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"marcus-ny"},"content":"otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC1 - Delete a contact","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"marcus-ny"},"content":"Precondition: `list` command shows a numbered list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"marcus-ny"},"content":"1. User requests to delete a contact, specifying the index.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"marcus-ny"},"content":"2. System deletes the contact from the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"marcus-ny"},"content":"3. System shows the contact that was deleted in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size) ","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC2 - Find a person by name","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"marcus-ny"},"content":"1. User searches for a contact with desired prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"marcus-ny"},"content":"2. System shows the list of contacts that match the prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"marcus-ny"},"content":"1a. User searches for a contact using an empty prompt. ","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"marcus-ny"},"content":"1a. No contact matches the prompt. ","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows a message in the status message that no contact matches the prompt.","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC3 - Link a loan to contact","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"marcus-ny"},"content":"1. User links a contact with a loan, specifying the contact name and loan details.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"marcus-ny"},"content":"2. System links the loan to the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"marcus-ny"},"content":"3. System shows the contact and the loan that was linked successfully in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"marcus-ny"},"content":"1a. Contact does not exist in the address book. ","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that no contact with the name exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"marcus-ny"},"content":"1a. Loan details are invalid (e.g. empty, incomplete, wrong format). ","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the loan details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"marcus-ny"},"content":"1a. Multiple contacts with the same name exist. ","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows list of contacts with the same name and asks user to choose one by index. ","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"marcus-ny"},"content":"1a2. User chooses a contact by index. ","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"marcus-ny"},"content":"1a3. System links the loan to the chosen contact. ","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"marcus-ny"},"content":"1a4. System shows the contact and the loan that was linked successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC4 - View all loans linked to particular contact","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"marcus-ny"},"content":"1. User requests to view all loans linked to a particular contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"marcus-ny"},"content":"2. System shows the list of loans linked to the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"marcus-ny"},"content":"1a. Contact name does not exist in the address book. ","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that no contact with the name exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"marcus-ny"},"content":"1a. Multiple contacts with the same name exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows list of contacts with the same name and asks user to choose one by index.","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"marcus-ny"},"content":"1a2. User chooses a contact by index.","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"marcus-ny"},"content":"1a3. System shows the list of loans linked to the chosen contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC5 - Clear a loan from contact","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"marcus-ny"},"content":"1. User \u003cu\u003eviews all loans linked to the contact (UC4)\u003c/u\u003e.","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"marcus-ny"},"content":"2. User issues `clear` command with the name of contact and the index of loan to be cleared.","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"marcus-ny"},"content":"3. System clears the loan from the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"marcus-ny"},"content":"4. System shows the contact and the loan that was cleared successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size)","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the index is invalid. ","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"marcus-ny"},"content":"#### Use case: UC6 - Mark a loan as returned","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"marcus-ny"},"content":"#### MSS","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"marcus-ny"},"content":"1. User \u003cu\u003eviews all loans linked to the contact (UC4)\u003c/u\u003e.","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"marcus-ny"},"content":"2. User marks a loan as returned specifying contact name and loan index.","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"marcus-ny"},"content":"3. System marks the loan as returned.","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"marcus-ny"},"content":"4. System shows the contact and the loan that was marked as returned successfully in the status message. ","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"marcus-ny"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"marcus-ny"},"content":"#### Extensions","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"marcus-ny"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"marcus-ny"},"content":"1a. Index is invalid (e.g. negative, zero, or larger than the list size) ","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"marcus-ny"},"content":"1a1. System shows an error message that the index is invalid. ","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"marcus-ny"},"content":"Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"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":467,"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":468,"author":{"gitId":"marcus-ny"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"marcus-ny"},"content":" able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"marcus-ny"},"content":"4. Should be able to handle up to 100 active (not archived) loans per contact without a noticeable sluggishness in","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"marcus-ny"},"content":" performance for typical","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"marcus-ny"},"content":" usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"marcus-ny"},"content":"5. Returned loans should be archived instead of deleted for future reference.","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"marcus-ny"},"content":"6. The archived data should be stored for at least 3 years.","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"marcus-ny"},"content":"7. Should be able to support multiple user sessions with password authentication on the same device.","lastModifiedDate":"2024-03-07"},{"lineNumber":476,"author":{"gitId":"marcus-ny"},"content":"8. Archived data should be encrypted and only accessible by authorized users (admin and the user who created the data).","lastModifiedDate":"2024-03-07"},{"lineNumber":477,"author":{"gitId":"marcus-ny"},"content":"9. Loan amounts should be in a single currency (e.g. USD, SGD, EUR, etc.) and should be formatted as per the currency","lastModifiedDate":"2024-03-07"},{"lineNumber":478,"author":{"gitId":"marcus-ny"},"content":" standards.","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"marcus-ny"},"content":"10. Loan deadlines should not be more than 100 years from the date of loan creation.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":484,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"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":493,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"marcus-ny"},"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":504,"author":{"gitId":"marcus-ny"},"content":" optimum.","lastModifiedDate":"2024-03-07"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"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":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"marcus-ny"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":523,"author":{"gitId":"marcus-ny"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-07"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"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":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"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":529,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"marcus-ny":211,"-":328}}] diff --git a/AY2324S2-CS2103T-W13-1_tp_master/commits.json b/AY2324S2-CS2103T-W13-1_tp_master/commits.json index 04c76476..dcbcbd40 100644 --- a/AY2324S2-CS2103T-W13-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-W13-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"marcus-ny":[{"date":"2024-03-07","commitResults":[{"hash":"bbfef9edba350ff80222f9e797331dfa7a5f6f86","isMergeCommit":false,"messageTitle":"Update AboutUs.md for marcus-ny","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"60d4f1873ae6ad4538324dcd87bf7f390ddb8b15","isMergeCommit":false,"messageTitle":"Add non-trivial use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":228,"deletions":81}}},{"hash":"afdff3047dfa140ff4d8be10b83cd89b8d543002","isMergeCommit":false,"messageTitle":"Format Use Cases in Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":38}}},{"hash":"19c2bc4c69b911d01dad12a331c100772fe7052b","isMergeCommit":false,"messageTitle":"Add Non-functional requirements to DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":2}}},{"hash":"d6ec0448fa59e016b58a1dec39c081c9406711e3","isMergeCommit":true,"messageTitle":"Merge pull request #26 from narwhalsilent/branch-AboutUs-Junwu","messageBody":"Fixes #15 Update AboutUs to include Junwu","fileTypesAndContributionMap":{}}]}],"xiaorui-ui":[],"Joseph31416":[{"date":"2024-03-06","commitResults":[{"hash":"ae1b6859af73c81f67d6c14374c32e7f0d1455b4","isMergeCommit":false,"messageTitle":"update jospeh\u0027s AboutUs.md section","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"fea27c42f67a8be4e80947a6800041698dfb5cbc","isMergeCommit":true,"messageTitle":"Merge pull request #17 from kjw142857/about-us","messageBody":"Fixes #8 Jun Wei\u0027s AboutUs.md update","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"0035d59ed9018e5f0406d2ff491a7ffcfb354096","isMergeCommit":true,"messageTitle":"Merge pull request #22 from marcus-ny/branch-update-DG-usecases-and-nfrs","messageBody":"Update Use Cases and NFRs in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"320fafc0b0d07970b7efc16ff68b4bebee7c6079","isMergeCommit":true,"messageTitle":"Merge pull request #20 from kjw142857/update-readme","messageBody":"Fixes #10 Edit README.md to reflect project scope","fileTypesAndContributionMap":{}},{"hash":"fc68db89ce36d2caa2b8cc3e2074d774a514a601","isMergeCommit":true,"messageTitle":"Merge pull request #25 from narwhalsilent/branch-ReadMEUi","messageBody":"Fixes #16 Update UI Mockup","fileTypesAndContributionMap":{}}]}],"kjw142857":[{"date":"2024-03-06","commitResults":[{"hash":"6c58495f0d7410c532dd4a9533b4d1e9af3660d7","isMergeCommit":false,"messageTitle":"Add developer info in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"1243ec8fc9b0c3c3dc65a40282b83f604c4c37a6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"ad4b7d0f93d2a9ced885d29bad129fb952bdcaac","isMergeCommit":true,"messageTitle":"Merge pull request #21 from marcus-ny/branch-update-AboutUs-marcus-ny","messageBody":"Update AboutUs.md for marcus-ny","fileTypesAndContributionMap":{}}]}],"narwhalsilent":[{"date":"2024-03-06","commitResults":[{"hash":"319b2ff3f2a0368ef1ffc897aaa2972b6392a01a","isMergeCommit":true,"messageTitle":"Merge pull request #14 from Joseph31416/update_joseph_about_us","messageBody":"fixes #5 Tze Tzun\u0027s AboutUs.md update","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"1decddfade9a6cb0fa0e2eecb4f689dc6c099065","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027 into branch-ReadMEUi","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2ab4f18be1b172d61a49af6b26d7d5dba6233630","isMergeCommit":false,"messageTitle":"Update AboutUs to include Junwu","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]}]},"authorFileTypeContributionMap":{"marcus-ny":{"docs":217,"functional-code":0,"test-code":0},"xiaorui-ui":{"docs":0,"functional-code":0,"test-code":0},"Joseph31416":{"docs":3,"functional-code":0,"test-code":0},"kjw142857":{"docs":15,"functional-code":0,"test-code":0},"narwhalsilent":{"docs":5,"functional-code":0,"test-code":0}},"authorContributionVariance":{"marcus-ny":11203.944,"xiaorui-ui":0.0,"Joseph31416":2.3877552,"kjw142857":28.836735,"narwhalsilent":6.6326528},"authorDisplayNameMap":{"marcus-ny":"CS2103T-W13-1 KYAL..THET","xiaorui-ui":"CS2103T-W13-1 ZHAN..ORUI","Joseph31416":"CS2103T-W13-1 TEOH..TZUN","kjw142857":"CS2103T-W13-1 KHOR.. WEI","narwhalsilent":"CS2103T-W13-1 WANG..UNWU"}} +{"authorDailyContributionsMap":{"marcus-ny":[{"date":"2024-03-07","commitResults":[{"hash":"bbfef9edba350ff80222f9e797331dfa7a5f6f86","isMergeCommit":false,"messageTitle":"Update AboutUs.md for marcus-ny","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"60d4f1873ae6ad4538324dcd87bf7f390ddb8b15","isMergeCommit":false,"messageTitle":"Add non-trivial use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":228,"deletions":81}}},{"hash":"afdff3047dfa140ff4d8be10b83cd89b8d543002","isMergeCommit":false,"messageTitle":"Format Use Cases in Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":38}}},{"hash":"19c2bc4c69b911d01dad12a331c100772fe7052b","isMergeCommit":false,"messageTitle":"Add Non-functional requirements to DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":2}}},{"hash":"d6ec0448fa59e016b58a1dec39c081c9406711e3","isMergeCommit":true,"messageTitle":"Merge pull request #26 from narwhalsilent/branch-AboutUs-Junwu","messageBody":"Fixes #15 Update AboutUs to include Junwu","fileTypesAndContributionMap":{}}]}],"xiaorui-ui":[{"date":"2024-03-07","commitResults":[{"hash":"f5946afe35d1d3df7f081a9deb0f5451c37f8b55","isMergeCommit":false,"messageTitle":"Update AboutUs xiaorui-ui","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"b518e1ed78a56bb52109d19bea651a8431376191","isMergeCommit":false,"messageTitle":"Update aboutus xiaorui","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"Joseph31416":[{"date":"2024-03-06","commitResults":[{"hash":"ae1b6859af73c81f67d6c14374c32e7f0d1455b4","isMergeCommit":false,"messageTitle":"update jospeh\u0027s AboutUs.md section","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"fea27c42f67a8be4e80947a6800041698dfb5cbc","isMergeCommit":true,"messageTitle":"Merge pull request #17 from kjw142857/about-us","messageBody":"Fixes #8 Jun Wei\u0027s AboutUs.md update","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"0035d59ed9018e5f0406d2ff491a7ffcfb354096","isMergeCommit":true,"messageTitle":"Merge pull request #22 from marcus-ny/branch-update-DG-usecases-and-nfrs","messageBody":"Update Use Cases and NFRs in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"320fafc0b0d07970b7efc16ff68b4bebee7c6079","isMergeCommit":true,"messageTitle":"Merge pull request #20 from kjw142857/update-readme","messageBody":"Fixes #10 Edit README.md to reflect project scope","fileTypesAndContributionMap":{}},{"hash":"fc68db89ce36d2caa2b8cc3e2074d774a514a601","isMergeCommit":true,"messageTitle":"Merge pull request #25 from narwhalsilent/branch-ReadMEUi","messageBody":"Fixes #16 Update UI Mockup","fileTypesAndContributionMap":{}}]}],"kjw142857":[{"date":"2024-03-06","commitResults":[{"hash":"6c58495f0d7410c532dd4a9533b4d1e9af3660d7","isMergeCommit":false,"messageTitle":"Add developer info in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]},{"date":"2024-03-07","commitResults":[{"hash":"1243ec8fc9b0c3c3dc65a40282b83f604c4c37a6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"ad4b7d0f93d2a9ced885d29bad129fb952bdcaac","isMergeCommit":true,"messageTitle":"Merge pull request #21 from marcus-ny/branch-update-AboutUs-marcus-ny","messageBody":"Update AboutUs.md for marcus-ny","fileTypesAndContributionMap":{}},{"hash":"f36fdec8ff32dea0e9170cd5389e525d1076e192","isMergeCommit":true,"messageTitle":"Merge pull request #27 from xiaorui-ui/Aboutus-xiaorui","messageBody":"Update AboutUs xiaorui-ui","fileTypesAndContributionMap":{}}]}],"narwhalsilent":[{"date":"2024-03-06","commitResults":[{"hash":"319b2ff3f2a0368ef1ffc897aaa2972b6392a01a","isMergeCommit":true,"messageTitle":"Merge pull request #14 from Joseph31416/update_joseph_about_us","messageBody":"fixes #5 Tze Tzun\u0027s AboutUs.md update","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"1decddfade9a6cb0fa0e2eecb4f689dc6c099065","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027 into branch-ReadMEUi","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2ab4f18be1b172d61a49af6b26d7d5dba6233630","isMergeCommit":false,"messageTitle":"Update AboutUs to include Junwu","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]}]},"authorFileTypeContributionMap":{"marcus-ny":{"docs":217,"functional-code":0,"test-code":0},"xiaorui-ui":{"docs":5,"functional-code":0,"test-code":0},"Joseph31416":{"docs":3,"functional-code":0,"test-code":0},"kjw142857":{"docs":15,"functional-code":0,"test-code":0},"narwhalsilent":{"docs":5,"functional-code":0,"test-code":0}},"authorContributionVariance":{"marcus-ny":11203.944,"xiaorui-ui":9.551021,"Joseph31416":2.3877552,"kjw142857":28.836735,"narwhalsilent":6.6326528},"authorDisplayNameMap":{"marcus-ny":"CS2103T-W13-1 KYAL..THET","xiaorui-ui":"CS2103T-W13-1 ZHAN..ORUI","Joseph31416":"CS2103T-W13-1 TEOH..TZUN","kjw142857":"CS2103T-W13-1 KHOR.. WEI","narwhalsilent":"CS2103T-W13-1 WANG..UNWU"}} diff --git a/AY2324S2-CS2103T-W13-4_tp_master/authorship.json b/AY2324S2-CS2103T-W13-4_tp_master/authorship.json index 04427b71..2dce71ec 100644 --- a/AY2324S2-CS2103T-W13-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W13-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chin-herng"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W13-4/tp/actions)","lastModifiedDate":"2024-03-06"},{"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":"chin-herng"},"content":"# TeamTracker","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"chin-herng"},"content":"## Description","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"chin-herng"},"content":"TeamTracker is a productivity app designed for leaders managing teams, aimed at reducing the stress of task management and team coordination. It helps keep track of team members\u0027 contact info, roles, tasks, deadlines, and meetings, offering leaders a clearer overview of their team\u0027s structure and responsibilities.","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"chin-herng"},"content":"## Table of Contents","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"chin-herng"},"content":"- [TeamTracker](#teamtracker)","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"chin-herng"},"content":" - [Description](#description)","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"chin-herng"},"content":" - [Table of Contents](#table-of-contents)","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"chin-herng"},"content":" - [Installation](#installation)","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"chin-herng"},"content":" - [Usage](#usage)","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"chin-herng"},"content":" - [Credits](#credits)","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"chin-herng"},"content":"## Installation","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"chin-herng"},"content":"Download the latest `teamtracker.jar` from [here](https://github.com/AY2324S2-CS2103T-W13-4/tp/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"chin-herng"},"content":"## Usage","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"chin-herng"},"content":"1. Ensure you have Java `11` or above installed in your computer.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"chin-herng"},"content":"2. Copy `teamtracker.jar` to the folder you want to use as the _home folder_ for TeamTracker.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"chin-herng"},"content":"3. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar teamtracker.jar` command to run the application.","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"chin-herng"},"content":"## Credits","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"chin-herng"},"content":"This project is evolved from the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"chin-herng":25,"-":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":"breezetall"},"content":"### Abdul Khaliq","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"nobodyishappy"},"content":"\u003cimg src\u003d\"images/breezetall.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"breezetall"},"content":"[[github](https://github.com/breezetall)]","lastModifiedDate":"2024-03-06"},{"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":"chin-herng"},"content":"### Chong Chin Herng","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"chin-herng"},"content":"\u003cimg src\u003d\"images/chin-herng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"chin-herng"},"content":"[[github](http://github.com/chin-herng)]","lastModifiedDate":"2024-03-06"},{"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":"Kaya3842"},"content":"### Dinh Tran Hai Chien","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Kaya3842"},"content":"\u003cimg src\u003d\"images/kaya3842.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Kaya3842"},"content":"[[github](http://github.com/Kaya3842)]","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"nobodyishappy"},"content":"### Tang Hao Liang","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"nobodyishappy"},"content":"\u003cimg src\u003d\"images/nobodyishappy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"nobodyishappy"},"content":"[[github](http://github.com/nobodyishappy)]","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"nobodyishappy"},"content":"* Responsibilities: Mark/Unmark Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"breezetall"},"content":"### Yong Shi Kang","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"nobodyishappy"},"content":"\u003cimg src\u003d\"images/yskie.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"Yskie"},"content":"[[github](http://github.com/yskie)]","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Yskie"},"content":"* Responsibilities: Deletion Feature","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Kaya3842":3,"Yskie":2,"chin-herng":3,"nobodyishappy":6,"-":42,"breezetall":3}},{"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":"Kaya3842"},"content":"# TeamTracker 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":"-"},"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":"nobodyishappy"},"content":"* are currently managing people for groups","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"nobodyishappy"},"content":"* has a tendency to forget tasks to complete","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"nobodyishappy"},"content":"**Value proposition**: This app aims to help leaders to keep track of members of formed groups and their contact information. This app helps to keep track of individual and group tasks, deadlines and meetings, thus allowing them to have a better overview of the structure.","lastModifiedDate":"2024-03-06"},{"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":"nobodyishappy"},"content":"|----------|--------------------------------------------|-------------------------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"nobodyishappy"},"content":"| `* * *` | student | add personal tasks | keep up to date with the different tasks to complete |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"nobodyishappy"},"content":"| `* * *` | student | delete tasks | |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"nobodyishappy"},"content":"| `* * *` | student | mark/unmark the tasks as done/not done | keep track of tasks that are completed |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"nobodyishappy"},"content":"| `* *` | group leader | assign tasks to individuals within the group | manage individual tasks |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"nobodyishappy"},"content":"| `* *` | busy group leader | see an overview of all the saved task | save time |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"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":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"breezetall"},"content":"**Use case: Assigns a task**","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"breezetall"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"breezetall"},"content":"2. TeamTracker shows a list of contacts","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"breezetall"},"content":"3. User requests to assign a task to a contact","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"breezetall"},"content":"4. TeamTracker assigns the task to the contact","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"breezetall"},"content":"* 4a. The task given does not exist.","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"breezetall"},"content":"* 4a1. TeamTracker shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"breezetall"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"breezetall"},"content":"**Use case: Delete a task**","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"breezetall"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"breezetall"},"content":"1. User requests to list tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"breezetall"},"content":"2. TeamTracker shows a list of tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"breezetall"},"content":"3. User requests to delete a specific task in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"breezetall"},"content":"4. TeamTracker deletes the task","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"breezetall"},"content":"* 3a1. TeamTracker shows an error message.","lastModifiedDate":"2024-03-06"},{"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":"breezetall"},"content":"**Use case: Add a task**","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"breezetall"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"breezetall"},"content":"1. User requests to add a task to the list of tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"breezetall"},"content":"2. TeamTracker adds to the list","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"breezetall"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"breezetall"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"breezetall"},"content":"* 2a. The given parameters is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"breezetall"},"content":"* 2a1. TeamTracker shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"breezetall"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"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":370,"author":{"gitId":"Yskie"},"content":"2. Should be able to be used for long periods without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"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":372,"author":{"gitId":"Yskie"},"content":"4. Should respond within one seconds.","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"Yskie"},"content":"5. Documentation should be easy for users that are inexperienced in command line to follow.","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"Kaya3842"},"content":"6. User Interface should be straightforward and intuitive to navigate even for first-time users.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"Yskie"},"content":"7. Should be able to store more than 10,000 tasks.","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"Yskie"},"content":"8. Should lose no more than 1-action worth of work in case of an app crash.","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"Yskie"},"content":"9. Should work without internet access.","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":382,"author":{"gitId":"Kaya3842"},"content":"* **System admin commands**: commands or instructions that are used through a command-line interface (CLI) ","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"Kaya3842"},"content":"or a terminal window","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"Kaya3842"},"content":"* **Action**: The AddressBook processing a user command","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":394,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":395,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"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":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"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":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"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":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"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":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"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":429,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Kaya3842":5,"Yskie":6,"nobodyishappy":9,"-":385,"breezetall":34}},{"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":"nobodyishappy"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eTeamTracker\u003c/a\u003e","lastModifiedDate":"2024-03-06"},{"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":{"nobodyishappy":1,"-":66}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chin-herng"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W13-4/tp/actions)","lastModifiedDate":"2024-03-06"},{"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":"chin-herng"},"content":"# TeamTracker","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"chin-herng"},"content":"## Description","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"chin-herng"},"content":"TeamTracker is a productivity app designed for leaders managing teams, aimed at reducing the stress of task management and team coordination. It helps keep track of team members\u0027 contact info, roles, tasks, deadlines, and meetings, offering leaders a clearer overview of their team\u0027s structure and responsibilities.","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"chin-herng"},"content":"## Table of Contents","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"chin-herng"},"content":"- [TeamTracker](#teamtracker)","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"chin-herng"},"content":" - [Description](#description)","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"chin-herng"},"content":" - [Table of Contents](#table-of-contents)","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"chin-herng"},"content":" - [Installation](#installation)","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"chin-herng"},"content":" - [Usage](#usage)","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"chin-herng"},"content":" - [Credits](#credits)","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"chin-herng"},"content":"## Installation","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"chin-herng"},"content":"Download the latest `teamtracker.jar` from [here](https://github.com/AY2324S2-CS2103T-W13-4/tp/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"chin-herng"},"content":"## Usage","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"chin-herng"},"content":"1. Ensure you have Java `11` or above installed in your computer.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"chin-herng"},"content":"2. Copy `teamtracker.jar` to the folder you want to use as the _home folder_ for TeamTracker.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"chin-herng"},"content":"3. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar teamtracker.jar` command to run the application.","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"chin-herng"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"chin-herng"},"content":"## Credits","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"chin-herng"},"content":"This project is evolved from the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"chin-herng":25,"-":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":"breezetall"},"content":"### Abdul Khaliq","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"nobodyishappy"},"content":"\u003cimg src\u003d\"images/breezetall.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"breezetall"},"content":"[[github](https://github.com/breezetall)]","lastModifiedDate":"2024-03-06"},{"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":"chin-herng"},"content":"### Chong Chin Herng","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"chin-herng"},"content":"\u003cimg src\u003d\"images/chin-herng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"chin-herng"},"content":"[[github](http://github.com/chin-herng)]","lastModifiedDate":"2024-03-06"},{"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":"Kaya3842"},"content":"### Dinh Tran Hai Chien","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Kaya3842"},"content":"\u003cimg src\u003d\"images/kaya3842.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Kaya3842"},"content":"[[github](http://github.com/Kaya3842)]","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"nobodyishappy"},"content":"### Tang Hao Liang","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"nobodyishappy"},"content":"\u003cimg src\u003d\"images/nobodyishappy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"nobodyishappy"},"content":"[[github](http://github.com/nobodyishappy)]","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"nobodyishappy"},"content":"* Responsibilities: Mark/Unmark Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"breezetall"},"content":"### Yong Shi Kang","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"nobodyishappy"},"content":"\u003cimg src\u003d\"images/yskie.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"Yskie"},"content":"[[github](http://github.com/yskie)]","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Yskie"},"content":"* Responsibilities: Deletion Feature","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Kaya3842":3,"Yskie":2,"chin-herng":3,"nobodyishappy":6,"-":42,"breezetall":3}},{"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":"Kaya3842"},"content":"# TeamTracker 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":"-"},"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":"nobodyishappy"},"content":"* are currently managing people for groups","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"nobodyishappy"},"content":"* has a tendency to forget tasks to complete","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"nobodyishappy"},"content":"**Value proposition**: This app aims to help leaders to keep track of members of formed groups and their contact information. This app helps to keep track of individual and group tasks, deadlines and meetings, thus allowing them to have a better overview of the structure.","lastModifiedDate":"2024-03-06"},{"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":"nobodyishappy"},"content":"|----------|--------------------------------------------|-------------------------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"nobodyishappy"},"content":"| `* * *` | student | add personal tasks | keep up to date with the different tasks to complete |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"nobodyishappy"},"content":"| `* * *` | student | delete tasks | |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"nobodyishappy"},"content":"| `* * *` | student | mark/unmark the tasks as done/not done | keep track of tasks that are completed |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"nobodyishappy"},"content":"| `* *` | group leader | assign tasks to individuals within the group | manage individual tasks |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"nobodyishappy"},"content":"| `* *` | busy group leader | see an overview of all the saved task | save time |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"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":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"breezetall"},"content":"**Use case: Assigns a task**","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"breezetall"},"content":"1. User requests to list of contacts","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"breezetall"},"content":"2. TeamTracker shows a list of contacts","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"breezetall"},"content":"3. User requests to assign a task to a contact","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"breezetall"},"content":"4. TeamTracker assigns the task to the contact","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"breezetall"},"content":"* 4a. The task given does not exist.","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"breezetall"},"content":"* 4a1. TeamTracker shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"breezetall"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"breezetall"},"content":"**Use case: Delete a task**","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"breezetall"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"breezetall"},"content":"1. User requests to list tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"breezetall"},"content":"2. TeamTracker shows a list of tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"breezetall"},"content":"3. User requests to delete a specific task in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"breezetall"},"content":"4. TeamTracker deletes the task","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"breezetall"},"content":"* 3a1. TeamTracker shows an error message.","lastModifiedDate":"2024-03-06"},{"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":"breezetall"},"content":"**Use case: Add a task**","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"breezetall"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"breezetall"},"content":"1. User requests to add a task to the list of tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"breezetall"},"content":"2. TeamTracker adds to the list","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"breezetall"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"breezetall"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"breezetall"},"content":"* 2a. The given parameters is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"breezetall"},"content":"* 2a1. TeamTracker shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"breezetall"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"breezetall"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"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":370,"author":{"gitId":"Yskie"},"content":"2. Should be able to be used for long periods without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"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":372,"author":{"gitId":"Yskie"},"content":"4. Should respond within one seconds.","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"Yskie"},"content":"5. Documentation should be easy for users that are inexperienced in command line to follow.","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"Kaya3842"},"content":"6. User Interface should be straightforward and intuitive to navigate even for first-time users.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"Yskie"},"content":"7. Should be able to store more than 10,000 tasks.","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"Yskie"},"content":"8. Should lose no more than 1 command worth of work in case of an app crash.","lastModifiedDate":"2024-03-08"},{"lineNumber":377,"author":{"gitId":"Yskie"},"content":"9. Should work without internet access.","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":382,"author":{"gitId":"Kaya3842"},"content":"* **System admin commands**: commands or instructions that are used through a command-line interface (CLI) ","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"Kaya3842"},"content":"or a terminal window","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"Kaya3842"},"content":"* **Action**: The AddressBook processing a user command","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":394,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":395,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"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":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"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":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"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":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"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":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"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":429,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Kaya3842":5,"Yskie":6,"nobodyishappy":9,"-":385,"breezetall":34}},{"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":"nobodyishappy"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eTeamTracker\u003c/a\u003e","lastModifiedDate":"2024-03-06"},{"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":{"nobodyishappy":1,"-":66}}] diff --git a/AY2324S2-CS2103T-W13-4_tp_master/commits.json b/AY2324S2-CS2103T-W13-4_tp_master/commits.json index e6eeb81e..ce7429e2 100644 --- a/AY2324S2-CS2103T-W13-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-W13-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Kaya3842":[{"date":"2024-03-06","commitResults":[{"hash":"5dc5526c7a70d582293b62d4e46b0d2c89ba86f6","isMergeCommit":false,"messageTitle":"Modify AboutUs.md","messageBody":"Add personal details into AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"25649451a81959afeb7956f8cddac57abba87b75","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Kaya3842/master","messageBody":"Update Dinh Tran Hai Chien\u0027s AboutUs Page","fileTypesAndContributionMap":{}},{"hash":"e3ad321076d40797dfc5d4d54214d89424be2bb0","isMergeCommit":true,"messageTitle":"Merge pull request #26 from Yskie/master","messageBody":"Update Non-Functional Requirement in DG","fileTypesAndContributionMap":{}},{"hash":"664cf0357795f38d2cd5db1459d8f99542191f99","isMergeCommit":true,"messageTitle":"Merge pull request #27 from chin-herng/master","messageBody":"Update README page to match project","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"f3caf8dd4e8017ebcbfd5e68ee949bf1dc76c03b","isMergeCommit":false,"messageTitle":"Add Glossary in DeveloperGuide","messageBody":"Define terms that are worth recording in the Glossary section.\n\nFix some typos in the DeveloperGuide.md\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":3}}}]}],"Yskie":[{"date":"2024-03-06","commitResults":[{"hash":"6a619e789b36226aee8f1ad8ba15582ef4c653ff","isMergeCommit":false,"messageTitle":"Update Shikang AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":3}}},{"hash":"bd074253dfa66d3b16cfc99447291941de64a9c9","isMergeCommit":false,"messageTitle":"Modify Shikang AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"172085faf0e4b3502af1a1f3f27e955d3ed1b93a","isMergeCommit":false,"messageTitle":"Modify Shikang AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d3f5515d1a2731225994c6c333e1cfd4025837f7","isMergeCommit":true,"messageTitle":"Merge pull request #17 from breezetall/master","messageBody":"Update Abdul Khaliq\u0027s AboutUs","fileTypesAndContributionMap":{}},{"hash":"f2013cb35d2ec15829bf983181fc08d5045b5403","isMergeCommit":false,"messageTitle":"Update Non-Functional Requirements in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"5cd44ecbb1516d48c5923170eae1f95f6f5e5d58","isMergeCommit":false,"messageTitle":"Modify Non-Functional Requirements in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"debd3c4b3ed83293dcae61a5373288998e3b09ac","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}}]}],"chin-herng":[{"date":"2024-03-06","commitResults":[{"hash":"898d85c7dbe463226e11bb1d0e264b834d15cfa5","isMergeCommit":false,"messageTitle":"Update Chin Herng\u0027s AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"fda490fd84aa103c70da6195a1a81535be39eb84","isMergeCommit":true,"messageTitle":"Merge pull request #24 from nobodyishappy/master","messageBody":"Update product scope and user stories in developer guide","fileTypesAndContributionMap":{}},{"hash":"bfa98f345565e9ff49388cb2852e43229a4afbc1","isMergeCommit":false,"messageTitle":"Update README page to match project","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":11}}},{"hash":"1cf99c1b51f220e0cc8c55f838fea9d7baa5168c","isMergeCommit":false,"messageTitle":"README.md: Add newline at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"nobodyishappy":[{"date":"2024-03-04","commitResults":[{"hash":"915d3cbcb1268c209db4809738c5839cb7b1c3ab","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-W13-4/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"cf67e11de780459221e906d2bceddfb5190e188e","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"Changing product name","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"019455c8951b12888a4cb968b85cd946f2ed14a6","isMergeCommit":true,"messageTitle":"Merge pull request #21 from chin-herng/master","messageBody":"Update Chin Herng\u0027s AboutUs page","fileTypesAndContributionMap":{}},{"hash":"f54e4039b477720052c6c773e159c6903ae13f47","isMergeCommit":false,"messageTitle":"Update Hao Liang\u0027s AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":11}}},{"hash":"b5e582ff4d9dd0f78a49b8d58b6aff55641152da","isMergeCommit":false,"messageTitle":"Update product scope in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"0be05672a478d5604df050bc5596b92ffeaef044","isMergeCommit":true,"messageTitle":"Merge pull request #25 from breezetall/master","messageBody":"Update use cases","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"919dbc0a0bec9f94de5f0449739e40e62f6bce49","isMergeCommit":true,"messageTitle":"Merge pull request #29 from chin-herng/master","messageBody":"Add UI mockup","fileTypesAndContributionMap":{}}]}],"breezetall":[{"date":"2024-03-06","commitResults":[{"hash":"635ad2a9578b9694e0d4f5a8060f20bd31e65d08","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Yskie/master","messageBody":"Update Shi Kang\u0027s AboutUs","fileTypesAndContributionMap":{}},{"hash":"87badb2d15f3d4bf908153f565c075930e3e1553","isMergeCommit":false,"messageTitle":"Update Khaliq\u0027s AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"1002cad86f886c88b96fd0bc018638d91c8210a8","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W13-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a569c1d265307c2fa724734158397dc02e141273","isMergeCommit":false,"messageTitle":"Add Khaliq\u0027s AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":5}}},{"hash":"e3111b9d39e66f40f3488a1135cd1e9c46cd9cd6","isMergeCommit":true,"messageTitle":"Merge pull request #23 from nobodyishappy/master","messageBody":"Update Hao Liang\u0027s AboutUs page","fileTypesAndContributionMap":{}},{"hash":"b6a976ae1deb2e241764015a6aab35892bf1db6f","isMergeCommit":false,"messageTitle":"Add use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":9}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6443f4e75030b16e1e14c0b9d566d780b944c2ad","isMergeCommit":true,"messageTitle":"Merge pull request #28 from Kaya3842/master","messageBody":"Add Glossary in DeveloperGuide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Kaya3842":{"docs":8,"functional-code":0,"test-code":0},"Yskie":{"docs":8,"functional-code":0,"test-code":0},"chin-herng":{"docs":28,"functional-code":0,"test-code":0},"nobodyishappy":{"docs":16,"functional-code":0,"test-code":0},"breezetall":{"docs":37,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Kaya3842":7.2091837,"Yskie":29.25,"chin-herng":128.40817,"nobodyishappy":128.40817,"breezetall":280.22958},"authorDisplayNameMap":{"Kaya3842":"CS2103T-W13-4 DINH..HIEN","Yskie":"CS2103T-W13-4 YONG..KANG","chin-herng":"CS2103T-W13-4 CHON..ERNG","nobodyishappy":"CS2103T-W13-4 TANG..IANG","breezetall":"CS2103T-W13-4 ABDU..SLAN"}} +{"authorDailyContributionsMap":{"Kaya3842":[{"date":"2024-03-06","commitResults":[{"hash":"5dc5526c7a70d582293b62d4e46b0d2c89ba86f6","isMergeCommit":false,"messageTitle":"Modify AboutUs.md","messageBody":"Add personal details into AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"25649451a81959afeb7956f8cddac57abba87b75","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Kaya3842/master","messageBody":"Update Dinh Tran Hai Chien\u0027s AboutUs Page","fileTypesAndContributionMap":{}},{"hash":"e3ad321076d40797dfc5d4d54214d89424be2bb0","isMergeCommit":true,"messageTitle":"Merge pull request #26 from Yskie/master","messageBody":"Update Non-Functional Requirement in DG","fileTypesAndContributionMap":{}},{"hash":"664cf0357795f38d2cd5db1459d8f99542191f99","isMergeCommit":true,"messageTitle":"Merge pull request #27 from chin-herng/master","messageBody":"Update README page to match project","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"f3caf8dd4e8017ebcbfd5e68ee949bf1dc76c03b","isMergeCommit":false,"messageTitle":"Add Glossary in DeveloperGuide","messageBody":"Define terms that are worth recording in the Glossary section.\n\nFix some typos in the DeveloperGuide.md\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":3}}}]}],"Yskie":[{"date":"2024-03-06","commitResults":[{"hash":"6a619e789b36226aee8f1ad8ba15582ef4c653ff","isMergeCommit":false,"messageTitle":"Update Shikang AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":3}}},{"hash":"bd074253dfa66d3b16cfc99447291941de64a9c9","isMergeCommit":false,"messageTitle":"Modify Shikang AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"172085faf0e4b3502af1a1f3f27e955d3ed1b93a","isMergeCommit":false,"messageTitle":"Modify Shikang AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d3f5515d1a2731225994c6c333e1cfd4025837f7","isMergeCommit":true,"messageTitle":"Merge pull request #17 from breezetall/master","messageBody":"Update Abdul Khaliq\u0027s AboutUs","fileTypesAndContributionMap":{}},{"hash":"f2013cb35d2ec15829bf983181fc08d5045b5403","isMergeCommit":false,"messageTitle":"Update Non-Functional Requirements in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":3}}},{"hash":"5cd44ecbb1516d48c5923170eae1f95f6f5e5d58","isMergeCommit":false,"messageTitle":"Modify Non-Functional Requirements in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"debd3c4b3ed83293dcae61a5373288998e3b09ac","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"1560c9c39fc62b4702ef9bcdd37ef2d8690d9dbd","isMergeCommit":false,"messageTitle":"Modify NFR section of DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"787cb93808ec38b2639f9d7655bcf6f026cfabba","isMergeCommit":true,"messageTitle":"Merge pull request #31 from Yskie/dg-nfr","messageBody":"Modify NFR section of Developer Guide","fileTypesAndContributionMap":{}}]}],"chin-herng":[{"date":"2024-03-06","commitResults":[{"hash":"898d85c7dbe463226e11bb1d0e264b834d15cfa5","isMergeCommit":false,"messageTitle":"Update Chin Herng\u0027s AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"fda490fd84aa103c70da6195a1a81535be39eb84","isMergeCommit":true,"messageTitle":"Merge pull request #24 from nobodyishappy/master","messageBody":"Update product scope and user stories in developer guide","fileTypesAndContributionMap":{}},{"hash":"bfa98f345565e9ff49388cb2852e43229a4afbc1","isMergeCommit":false,"messageTitle":"Update README page to match project","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":11}}},{"hash":"1cf99c1b51f220e0cc8c55f838fea9d7baa5168c","isMergeCommit":false,"messageTitle":"README.md: Add newline at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"nobodyishappy":[{"date":"2024-03-04","commitResults":[{"hash":"915d3cbcb1268c209db4809738c5839cb7b1c3ab","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-W13-4/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"cf67e11de780459221e906d2bceddfb5190e188e","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"Changing product name","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"019455c8951b12888a4cb968b85cd946f2ed14a6","isMergeCommit":true,"messageTitle":"Merge pull request #21 from chin-herng/master","messageBody":"Update Chin Herng\u0027s AboutUs page","fileTypesAndContributionMap":{}},{"hash":"f54e4039b477720052c6c773e159c6903ae13f47","isMergeCommit":false,"messageTitle":"Update Hao Liang\u0027s AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":11}}},{"hash":"b5e582ff4d9dd0f78a49b8d58b6aff55641152da","isMergeCommit":false,"messageTitle":"Update product scope in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"0be05672a478d5604df050bc5596b92ffeaef044","isMergeCommit":true,"messageTitle":"Merge pull request #25 from breezetall/master","messageBody":"Update use cases","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"919dbc0a0bec9f94de5f0449739e40e62f6bce49","isMergeCommit":true,"messageTitle":"Merge pull request #29 from chin-herng/master","messageBody":"Add UI mockup","fileTypesAndContributionMap":{}}]}],"breezetall":[{"date":"2024-03-06","commitResults":[{"hash":"635ad2a9578b9694e0d4f5a8060f20bd31e65d08","isMergeCommit":true,"messageTitle":"Merge pull request #16 from Yskie/master","messageBody":"Update Shi Kang\u0027s AboutUs","fileTypesAndContributionMap":{}},{"hash":"87badb2d15f3d4bf908153f565c075930e3e1553","isMergeCommit":false,"messageTitle":"Update Khaliq\u0027s AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"1002cad86f886c88b96fd0bc018638d91c8210a8","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W13-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a569c1d265307c2fa724734158397dc02e141273","isMergeCommit":false,"messageTitle":"Add Khaliq\u0027s AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":5}}},{"hash":"e3111b9d39e66f40f3488a1135cd1e9c46cd9cd6","isMergeCommit":true,"messageTitle":"Merge pull request #23 from nobodyishappy/master","messageBody":"Update Hao Liang\u0027s AboutUs page","fileTypesAndContributionMap":{}},{"hash":"b6a976ae1deb2e241764015a6aab35892bf1db6f","isMergeCommit":false,"messageTitle":"Add use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":9}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6443f4e75030b16e1e14c0b9d566d780b944c2ad","isMergeCommit":true,"messageTitle":"Merge pull request #28 from Kaya3842/master","messageBody":"Add Glossary in DeveloperGuide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Kaya3842":{"docs":8,"functional-code":0,"test-code":0},"Yskie":{"docs":8,"functional-code":0,"test-code":0},"chin-herng":{"docs":28,"functional-code":0,"test-code":0},"nobodyishappy":{"docs":16,"functional-code":0,"test-code":0},"breezetall":{"docs":37,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Kaya3842":6.8,"Yskie":27.315556,"chin-herng":120.46223,"nobodyishappy":120.46223,"breezetall":262.88892},"authorDisplayNameMap":{"Kaya3842":"CS2103T-W13-4 DINH..HIEN","Yskie":"CS2103T-W13-4 YONG..KANG","chin-herng":"CS2103T-W13-4 CHON..ERNG","nobodyishappy":"CS2103T-W13-4 TANG..IANG","breezetall":"CS2103T-W13-4 ABDU..SLAN"}} diff --git a/archive.zip b/archive.zip index c70b6d49b5ec7aeb7dc78994430edec0418f8b93..0f876062b4b3b7cbfb324b67b742b3999aa5c423 100644 GIT binary patch delta 469597 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

R-LA59`RUG6d2{c;+jRUD?>R)D8j1( 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

4#dpFy9r7_E{uttwrq73 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 D25ug# delta 381315 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�*<*$);>SB8SleugufPsabUf!Lf@_9 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

eSR!rH!l`(>tvy9`dUkg>6DsRfk^aG{ODWM> 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

xN?F%`p=S@~rjr5x z>{J7L!9E`fj*S1Lrt~f7S_aX3!orDBl@5u2CN@;m53)D_;Q1Ch#`Cy;MNt|gypW27<86i&r9=ebagJBOzP=1FTB;A$P77krE2Fs!EJvsgF zAf~@9EesplRMb}#M-7{q6KMi>1QoaJFO~S@g5y>dZSWjq&JR$sIqfiweW3gqW^&N8 zmW1J?|1=gF8J6J!fL*9jJlz+a8~Q7c>Wh#|hvPujPsSoac?J_M;sE+oU@apA!q1%u za3LL;Tu3@V55iRa9~*i|kboQfOjKYc59vRSe9+$b^BvTD@!UYS2EXFT0F;*?SGam} z#eNVn$JT$+2Zu8W$b!d=YF&-+AbfW`NI(GxQe>PVw^fFqZs(AI>J-dW;5y!MY(Hm7 zE!se&B&gjwtsS}i6WM=2G%S_vI6>;S`A_2-T8dnf3iQZ6-X?P4c6?}I!-^9gbVYRz zA|X0ie#8%sbH@vnpF=#HEs*}7B=!m+5WjmOfV$ek33B`jgLKUd72eZ6P$x?YPAF1S zfxJ>=1X1(E{}hbIsF^>y*8$+D2VLKCH%O0e=duF? z?-h8$L%FR!Aw>SrMv729RMcC@pyf{$t>`~ni&R*k3MctLeVQE+6g+QaPV@gMLvU(mt1QTThqUOE5}YLms{eJ8xQxcrW{^K7b-#qP15aACMjMJ@%k|{apphv-nYAF37^N$ik z>N@L)B(tEd=OMD5(2p-iw$P?)p)7yex;M5dQPy=Jf$$+@sa21h3a$ab&LX-|i2*8< zENq7gsZgXm_6Yg6LMVpvDA4C-y^fTJ$|&^bCRCe&Sl}B@oi>X+01SUbUqI+KasVpC z5ZlQ_^b2_*R0tLR+esm&kqdUTt&{?Q20!#^h+iWIpeiCl^rab<2oGeQ0xEQfyd6kU zD)1c{GduF{Ue#oXCHs!a?yb})_eG$Akwack50x8I$V*honJ*v*xFe{UsHy>!-y#E|w{M1Lu<5DnRU`B{CB($7chk7q+sP{UZHCl}SiXP`w1eS0LXjS?o z6l?4q4Jth&0WBj~Sw(+YB&Z`Q#3*G-XmjbYG^iHYoATJ?B=@q5BA_^4#zS8mV+C6Hocm*3oz)Bph2r|9!e{z8hOnr5Wz75PV! z98dx>hLZhhFZZ}bi|ANcPO2huKyx{V^#e($J^qG)c4={-g&c4RQ4x`%8+)}8I8cuf z0QvsuxvRry!EkD3airo}s3GmJ#v&=G;6akPX&~|_J{>9r{o#bN={;;_8syCTgY>Bu zrT{Pwpr5Rrr#~5R5-bkOMSd?Jk2wDyPh9Y(12Jf!f`hP=3@x-|;|nB(70iyHN1fp! zSg{D!r3N}w=iE+vY{E{VC@I`r04NH>Li3;YjuYAAtOCuWS9QhsN;VX>3I7RO5np;# zmq-%Ea9msw0|fXlO1TyTz=a-cv=!uDoeV%Z333xe^bk@iMFzxVtf-S_#0DN9$n&?5 zEi5>>(bq z&Wu$;2ZU7&P@O^Wh7df*lw%$-Bh(%t$l{C;nS71`)uZ?vF&>}OKs>#hJp%M4klz&0 zp=TPO#ghTYSJ#LES+4h=lt7#L1@*S4H}jU75z)Ay&KHmi-)4dq&ZI?>(M+9=VDT|C zqA-mxF>@e&?t1|qcRQ3S7E;mS1o526{sYHhf9py%bYVjHpMJK){&+xGAQKT%N5~Zz zvdP6L5njrP-oku$IvIdG(Lu`3lK8bBKlD8hY~Elf%>w@edCx8m diff --git a/reposense-logs/reposense.log.0 b/reposense-logs/reposense.log.0 index 01670c41..11db5520 100644 --- a/reposense-logs/reposense.log.0 +++ b/reposense-logs/reposense.log.0 @@ -1,42 +1,42 @@ -Mar 07, 2024 2:43:36 PM reposense.system.LogsManager addFileHandler +Mar 08, 2024 12:49:56 AM reposense.system.LogsManager addFileHandler INFO: Log temp folder has been successfully created -Mar 07, 2024 2:43:36 PM reposense.parser.CsvParser validateHeader +Mar 08, 2024 12:49:56 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 07, 2024 2:43:36 PM reposense.parser.RepoConfigCsvParser matchValueAndKeyword +Mar 08, 2024 12:49:57 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 07, 2024 2:43:36 PM reposense.parser.CsvParser validateHeader +Mar 08, 2024 12:49:57 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 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 07, 2024 2:43:36 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 12:49:57 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 07, 2024 2:43:36 PM reposense.parser.CsvParser validateHeader +Mar 08, 2024 12:49:57 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, group-config.csv, and recognized columns: Globs, Repository's Location, Group Name -Mar 07, 2024 2:43:36 PM reposense.git.GitConfig getGlobalGitLfsConfig +Mar 08, 2024 12:49:57 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 07, 2024 2:43:36 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:49:57 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-1/tp.git... -Mar 07, 2024 2:43:36 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:49:57 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-4/tp.git... +Mar 08, 2024 12:49:57 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-2/tp.git... -Mar 07, 2024 2:43:36 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:49:57 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-3/tp.git... -Mar 07, 2024 2:43:36 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-4/tp.git... -Mar 07, 2024 2:43:36 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... -Mar 07, 2024 2:43:36 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git to complete... -Mar 07, 2024 2:43:36 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git to complete... -Mar 07, 2024 2:43:36 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... +Mar 08, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git to complete... -Mar 07, 2024 2:43:37 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:57 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git to complete... +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git completed! -Mar 07, 2024 2:43:37 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-3/tp.git... -Mar 07, 2024 2:43:37 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:49:58 AM reposense.report.ReportGenerator analyzeRepos INFO: [1/92] Analyzing https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 07, 2024 2:43:37 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git to complete... -Mar 07, 2024 2:43:37 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:49:58 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:37 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:49:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 07, 2024 2:43:37 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:58 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! -Mar 07, 2024 2:43:37 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-4/tp.git... -Mar 07, 2024 2:43:37 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:49:58 AM reposense.report.ReportGenerator analyzeRepos INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 07, 2024 2:43:37 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git to complete... -Mar 07, 2024 2:43:38 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:49:58 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 08, 2024 12:49:58 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! +Mar 08, 2024 12:49:58 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:49:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 07, 2024 2:43:38 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 07, 2024 2:43:38 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! -Mar 07, 2024 2:43:38 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-2/tp.git... -Mar 07, 2024 2:43:38 PM reposense.report.ReportGenerator analyzeRepos -INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 07, 2024 2:43:38 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:58 AM reposense.report.ReportGenerator analyzeRepos +INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git to complete... -Mar 07, 2024 2:43:38 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! -Mar 07, 2024 2:43:38 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-3/tp.git... -Mar 07, 2024 2:43:38 PM reposense.report.ReportGenerator analyzeRepos -INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 07, 2024 2:43:38 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 07, 2024 2:43:38 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:58 AM reposense.report.ReportGenerator analyzeRepos +INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 08, 2024 12:49:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git to complete... -Mar 07, 2024 2:43:38 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 07, 2024 2:43:38 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:49:58 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:49:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 07, 2024 2:43:38 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! -Mar 07, 2024 2:43:38 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:49:59 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 12:49:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 08, 2024 12:49:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 07, 2024 2:43:38 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 07, 2024 2:43:38 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:49:59 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) completed! -Mar 07, 2024 2:43:39 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! -Mar 07, 2024 2:43:39 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 08, 2024 12:49:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 08, 2024 12:49:59 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git completed! -Mar 07, 2024 2:43:39 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-1/tp.git... -Mar 07, 2024 2:43:39 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:49:59 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) completed! +Mar 08, 2024 12:49:59 AM reposense.report.ReportGenerator analyzeRepos INFO: [5/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:49:59 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-1/tp.git... +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git to complete... -Mar 07, 2024 2:43:39 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:39 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 08, 2024 12:50:00 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! -Mar 07, 2024 2:43:39 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git completed! -Mar 07, 2024 2:43:39 PM reposense.report.ReportGenerator analyzeRepos -INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:00 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 12:50:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 08, 2024 12:50:00 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! +Mar 08, 2024 12:50:00 AM reposense.report.ReportGenerator analyzeRepos +INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... -Mar 07, 2024 2:43:39 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git to complete... -Mar 07, 2024 2:43:39 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! -Mar 07, 2024 2:43:39 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:39 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.report.ReportGenerator analyzeRepos -INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 07, 2024 2:43:39 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git completed! +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... -Mar 07, 2024 2:43:39 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... -Mar 07, 2024 2:43:39 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 07, 2024 2:43:40 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! -Mar 07, 2024 2:43:40 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:00 AM reposense.report.ReportGenerator analyzeRepos +INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 08, 2024 12:50:00 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 07, 2024 2:43:40 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... +Mar 08, 2024 12:50:00 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 12:50:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 08, 2024 12:50:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git completed! -Mar 07, 2024 2:43:40 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-2/tp.git... -Mar 07, 2024 2:43:40 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 08, 2024 12:50:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 08, 2024 12:50:00 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! +Mar 08, 2024 12:50:00 AM reposense.report.ReportGenerator analyzeRepos INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 07, 2024 2:43:40 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-2/tp.git... +Mar 08, 2024 12:50:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git to complete... -Mar 07, 2024 2:43:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 07, 2024 2:43:40 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 08, 2024 12:50:01 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 07, 2024 2:43:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 07, 2024 2:43:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 07, 2024 2:43:40 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) completed! -Mar 07, 2024 2:43:40 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! -Mar 07, 2024 2:43:40 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-4/tp.git... -Mar 07, 2024 2:43:40 PM reposense.report.ReportGenerator analyzeRepos -INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 07, 2024 2:43:40 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git to complete... -Mar 07, 2024 2:43:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 07, 2024 2:43:40 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) completed! -Mar 07, 2024 2:43:41 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:41 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:01 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git completed! -Mar 07, 2024 2:43:41 PM reposense.report.ReportGenerator analyzeRepos -INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:01 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-4/tp.git... +Mar 08, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepos +INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... +Mar 08, 2024 12:50:01 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git to complete... +Mar 08, 2024 12:50:01 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! +Mar 08, 2024 12:50:01 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-3/tp.git... -Mar 07, 2024 2:43:41 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git to complete... -Mar 07, 2024 2:43:41 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:01 AM reposense.report.ReportGenerator analyzeRepos +INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 08, 2024 12:50:01 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:41 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:01 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git to complete... +Mar 08, 2024 12:50:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! -Mar 07, 2024 2:43:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:01 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 12:50:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 08, 2024 12:50:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) completed! -Mar 07, 2024 2:43:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 08, 2024 12:50:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 08, 2024 12:50:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! -Mar 07, 2024 2:43:41 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 08, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! +Mar 08, 2024 12:50:02 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git completed! -Mar 07, 2024 2:43:41 PM reposense.report.ReportGenerator analyzeRepos -INFO: [11/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 07, 2024 2:43:41 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:02 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-2/tp.git... -Mar 07, 2024 2:43:41 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepos +INFO: [11/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 08, 2024 12:50:02 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git to complete... -Mar 07, 2024 2:43:42 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:02 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:42 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:02 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git completed! -Mar 07, 2024 2:43:42 PM reposense.report.ReportGenerator analyzeRepos -INFO: [12/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-1/tp.git... -Mar 07, 2024 2:43:42 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:02 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git completed! -Mar 07, 2024 2:43:42 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:02 AM reposense.report.ReportGenerator analyzeRepos +INFO: [12/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 08, 2024 12:50:02 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-1/tp.git... +Mar 08, 2024 12:50:02 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git to complete... -Mar 07, 2024 2:43:42 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-2/tp.git... -Mar 07, 2024 2:43:42 PM reposense.report.ReportGenerator analyzeRepos -INFO: [13/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git to complete... -Mar 07, 2024 2:43:42 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:02 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:42 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:02 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:42 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:03 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git completed! -Mar 07, 2024 2:43:42 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.ReportGenerator analyzeRepos -INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-1/tp.git... -Mar 07, 2024 2:43:42 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... -Mar 07, 2024 2:43:42 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:03 AM reposense.report.ReportGenerator analyzeRepos +INFO: [13/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... +Mar 08, 2024 12:50:03 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-2/tp.git... +Mar 08, 2024 12:50:03 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git to complete... +Mar 08, 2024 12:50:03 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:42 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! -Mar 07, 2024 2:43:42 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 08, 2024 12:50:03 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git completed! +Mar 08, 2024 12:50:03 AM reposense.report.ReportGenerator analyzeRepos +INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 08, 2024 12:50:03 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-1/tp.git... +Mar 08, 2024 12:50:03 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... +Mar 08, 2024 12:50:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 08, 2024 12:50:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 07, 2024 2:43:42 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:03 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! -Mar 07, 2024 2:43:43 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:03 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 12:50:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 08, 2024 12:50:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 08, 2024 12:50:03 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! +Mar 08, 2024 12:50:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 07, 2024 2:43:43 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 07, 2024 2:43:43 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:03 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) completed! -Mar 07, 2024 2:43:43 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git completed! -Mar 07, 2024 2:43:43 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... -Mar 07, 2024 2:43:43 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepos INFO: [15/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 07, 2024 2:43:43 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git to complete... -Mar 07, 2024 2:43:43 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 07, 2024 2:43:43 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 07, 2024 2:43:43 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git completed! -Mar 07, 2024 2:43:43 PM reposense.report.ReportGenerator analyzeRepos -INFO: [16/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 07, 2024 2:43:43 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-3/tp.git... -Mar 07, 2024 2:43:43 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepos +INFO: [16/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 08, 2024 12:50:04 AM reposense.report.ReportGenerator analyzeRepos +INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-2/tp.git... +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git to complete... -Mar 07, 2024 2:43:43 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git to complete... +Mar 08, 2024 12:50:04 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 12:50:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 08, 2024 12:50:04 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 07, 2024 2:43:43 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! -Mar 07, 2024 2:43:43 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-2/tp.git... -Mar 07, 2024 2:43:43 PM reposense.report.ReportGenerator analyzeRepos -INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 07, 2024 2:43:43 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 07, 2024 2:43:43 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! -Mar 07, 2024 2:43:43 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git to complete... -Mar 07, 2024 2:43:43 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:04 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! -Mar 07, 2024 2:43:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-4/tp.git... +Mar 08, 2024 12:50:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git to complete... +Mar 08, 2024 12:50:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 08, 2024 12:50:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) completed! -Mar 07, 2024 2:43:44 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepos INFO: [18/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-4/tp.git... -Mar 07, 2024 2:43:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git to complete... -Mar 07, 2024 2:43:44 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:44 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 08, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! +Mar 08, 2024 12:50:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) completed! -Mar 07, 2024 2:43:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:05 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 12:50:05 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 08, 2024 12:50:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 08, 2024 12:50:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! -Mar 07, 2024 2:43:44 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! -Mar 07, 2024 2:43:44 PM reposense.report.ReportGenerator analyzeRepos -INFO: [19/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 07, 2024 2:43:44 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:05 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git completed! +Mar 08, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepos +INFO: [19/92] Analyzing https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 08, 2024 12:50:05 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-1/tp.git... -Mar 07, 2024 2:43:44 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:05 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git to complete... -Mar 07, 2024 2:43:45 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! -Mar 07, 2024 2:43:45 PM reposense.report.ReportGenerator analyzeRepos -INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:05 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! +Mar 08, 2024 12:50:05 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-3/tp.git... -Mar 07, 2024 2:43:45 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:05 AM reposense.report.ReportGenerator analyzeRepos +INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 08, 2024 12:50:05 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 12:50:05 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 08, 2024 12:50:05 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... +Mar 08, 2024 12:50:06 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... -Mar 07, 2024 2:43:45 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git completed! -Mar 07, 2024 2:43:45 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:06 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! +Mar 08, 2024 12:50:06 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-4/tp.git... -Mar 07, 2024 2:43:45 PM reposense.report.ReportGenerator analyzeRepos -INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:06 AM reposense.report.ReportGenerator analyzeRepos +INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 08, 2024 12:50:06 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git to complete... -Mar 07, 2024 2:43:45 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:06 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! -Mar 07, 2024 2:43:45 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:06 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git completed! -Mar 07, 2024 2:43:45 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:06 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 08, 2024 12:50:06 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-2/tp.git... -Mar 07, 2024 2:43:45 PM reposense.report.ReportGenerator analyzeRepos -INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:06 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 08, 2024 12:50:06 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git to complete... -Mar 07, 2024 2:43:45 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:06 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 07, 2024 2:43:45 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:06 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) completed! -Mar 07, 2024 2:43:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:06 AM reposense.report.ReportGenerator analyzeRepos +INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 08, 2024 12:50:06 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 08, 2024 12:50:06 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! +Mar 08, 2024 12:50:06 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 12:50:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! +Mar 08, 2024 12:50:07 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) completed! -Mar 07, 2024 2:43:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:07 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:07 AM reposense.report.ReportGenerator analyzeRepos +INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... -Mar 07, 2024 2:43:46 PM reposense.report.ReportGenerator analyzeRepos -INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! -Mar 07, 2024 2:43:46 PM reposense.report.ReportGenerator analyzeRepos -INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-4/tp.git... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git to complete... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! -Mar 07, 2024 2:43:46 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-3/tp.git... +Mar 08, 2024 12:50:07 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 08, 2024 12:50:07 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) completed! +Mar 08, 2024 12:50:07 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 12:50:07 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 08, 2024 12:50:07 AM reposense.report.ReportGenerator analyzeRepos +INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git to complete... +Mar 08, 2024 12:50:07 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:07 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) completed! -Mar 07, 2024 2:43:46 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:07 AM reposense.report.ReportGenerator analyzeRepos +INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... +Mar 08, 2024 12:50:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... +Mar 08, 2024 12:50:07 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:46 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:07 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-3/tp.git... -Mar 07, 2024 2:43:46 PM reposense.report.ReportGenerator analyzeRepos -INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:07 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:46 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:07 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git to complete... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... -Mar 07, 2024 2:43:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... -Mar 07, 2024 2:43:46 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:46 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 07, 2024 2:43:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 07, 2024 2:43:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 08, 2024 12:50:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 07, 2024 2:43:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 07, 2024 2:43:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 07, 2024 2:43:47 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) completed! -Mar 07, 2024 2:43:47 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:08 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git completed! +Mar 08, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepos INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 07, 2024 2:43:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 08, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) completed! +Mar 08, 2024 12:50:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 07, 2024 2:43:47 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) completed! -Mar 07, 2024 2:43:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:08 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... +Mar 08, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepos +INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 08, 2024 12:50:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 07, 2024 2:43:47 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! -Mar 07, 2024 2:43:47 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:08 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git to complete... +Mar 08, 2024 12:50:08 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:08 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 07, 2024 2:43:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 07, 2024 2:43:47 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! -Mar 07, 2024 2:43:47 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... -Mar 07, 2024 2:43:47 PM reposense.report.ReportGenerator analyzeRepos -INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git to complete... -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) completed! -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git completed! -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator analyzeRepos -INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:08 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! +Mar 08, 2024 12:50:08 AM reposense.report.ReportGenerator analyzeRepos +INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 08, 2024 12:50:08 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-1/tp.git... -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:08 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git to complete... -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator analyzeRepos -INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-4/tp.git... -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:09 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:09 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 12:50:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 08, 2024 12:50:09 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! +Mar 08, 2024 12:50:09 AM reposense.report.ReportGenerator analyzeRepos +INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 08, 2024 12:50:09 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-4/tp.git... +Mar 08, 2024 12:50:09 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git to complete... -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:09 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 12:50:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 08, 2024 12:50:09 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:09 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-2/tp.git... -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... -Mar 07, 2024 2:43:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:09 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:09 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:09 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... +Mar 08, 2024 12:50:09 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator analyzeRepos -INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:09 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! +Mar 08, 2024 12:50:09 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) completed! -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:09 AM reposense.report.ReportGenerator analyzeRepos +INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 08, 2024 12:50:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 08, 2024 12:50:09 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) completed! +Mar 08, 2024 12:50:09 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 08, 2024 12:50:09 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 08, 2024 12:50:10 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) completed! -Mar 07, 2024 2:43:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 07, 2024 2:43:48 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) completed! -Mar 07, 2024 2:43:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git completed! -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! +Mar 08, 2024 12:50:10 AM reposense.report.ReportGenerator analyzeRepos +INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 08, 2024 12:50:10 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-4/tp.git... -Mar 07, 2024 2:43:49 PM reposense.report.ReportGenerator analyzeRepos -INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git to complete... -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! -Mar 07, 2024 2:43:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 07, 2024 2:43:49 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! -Mar 07, 2024 2:43:49 PM reposense.report.ReportGenerator analyzeRepos -INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:10 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 08, 2024 12:50:10 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 12:50:10 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 08, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git completed! +Mar 08, 2024 12:50:10 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-4/tp.git... -Mar 07, 2024 2:43:49 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:10 AM reposense.report.ReportGenerator analyzeRepos +INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 08, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git to complete... +Mar 08, 2024 12:50:10 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:10 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git to complete... -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 08, 2024 12:50:10 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! +Mar 08, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... -Mar 07, 2024 2:43:49 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:10 AM reposense.report.ReportGenerator analyzeRepos INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 07, 2024 2:43:49 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:10 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... +Mar 08, 2024 12:50:10 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... -Mar 07, 2024 2:43:49 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 07, 2024 2:43:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 07, 2024 2:43:49 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:11 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git completed! -Mar 07, 2024 2:43:50 PM reposense.report.ReportGenerator analyzeRepos -INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 07, 2024 2:43:50 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-4/tp.git... -Mar 07, 2024 2:43:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 07, 2024 2:43:50 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) completed! -Mar 07, 2024 2:43:50 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:11 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 12:50:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 08, 2024 12:50:11 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-4/tp.git... +Mar 08, 2024 12:50:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 08, 2024 12:50:11 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git to complete... -Mar 07, 2024 2:43:50 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:11 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 07, 2024 2:43:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 08, 2024 12:50:11 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) completed! +Mar 08, 2024 12:50:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 07, 2024 2:43:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 07, 2024 2:43:50 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:11 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) completed! -Mar 07, 2024 2:43:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 07, 2024 2:43:51 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:11 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git completed! -Mar 07, 2024 2:43:51 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:11 AM reposense.report.ReportGenerator analyzeRepos INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 07, 2024 2:43:51 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:11 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-2/tp.git... -Mar 07, 2024 2:43:51 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 08, 2024 12:50:11 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git to complete... -Mar 07, 2024 2:43:51 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! +Mar 08, 2024 12:50:12 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 07, 2024 2:43:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 07, 2024 2:43:51 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! -Mar 07, 2024 2:43:51 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! -Mar 07, 2024 2:43:51 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:12 AM reposense.report.ReportGenerator analyzeRepos INFO: [36/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 07, 2024 2:43:51 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:12 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-1/tp.git... -Mar 07, 2024 2:43:51 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git to complete... -Mar 07, 2024 2:43:51 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 08, 2024 12:50:12 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! +Mar 08, 2024 12:50:12 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 07, 2024 2:43:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 07, 2024 2:43:51 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! -Mar 07, 2024 2:43:51 PM reposense.report.ReportGenerator analyzeRepos -INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 07, 2024 2:43:51 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... -Mar 07, 2024 2:43:51 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... -Mar 07, 2024 2:43:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 08, 2024 12:50:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 07, 2024 2:43:51 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:12 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) completed! -Mar 07, 2024 2:43:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:12 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! -Mar 07, 2024 2:43:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! -Mar 07, 2024 2:43:52 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-3/tp.git... -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... -Mar 07, 2024 2:43:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! +Mar 08, 2024 12:50:12 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... +Mar 08, 2024 12:50:12 AM reposense.report.ReportGenerator analyzeRepos +INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 08, 2024 12:50:12 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... +Mar 08, 2024 12:50:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:12 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 12:50:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 08, 2024 12:50:12 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) completed! -Mar 07, 2024 2:43:52 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-1/tp.git... -Mar 07, 2024 2:43:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 08, 2024 12:50:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! -Mar 07, 2024 2:43:52 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:13 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! +Mar 08, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepos +INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 08, 2024 12:50:13 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-3/tp.git... +Mar 08, 2024 12:50:13 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... +Mar 08, 2024 12:50:13 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git completed! -Mar 07, 2024 2:43:52 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:13 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-1/tp.git... +Mar 08, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepos +INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 08, 2024 12:50:13 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git to complete... -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-2/tp.git... -Mar 07, 2024 2:43:52 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git to complete... -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:13 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:13 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 07, 2024 2:43:52 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:13 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 12:50:13 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 08, 2024 12:50:13 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! +Mar 08, 2024 12:50:13 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-2/tp.git... +Mar 08, 2024 12:50:13 AM reposense.report.ReportGenerator analyzeRepos +INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 08, 2024 12:50:13 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git to complete... +Mar 08, 2024 12:50:14 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:14 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 07, 2024 2:43:53 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:14 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 08, 2024 12:50:14 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git completed! -Mar 07, 2024 2:43:53 PM reposense.report.ReportGenerator analyzeRepos -INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 07, 2024 2:43:53 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:14 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-3/tp.git... -Mar 07, 2024 2:43:53 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:14 AM reposense.report.ReportGenerator analyzeRepos +INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 08, 2024 12:50:14 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git to complete... -Mar 07, 2024 2:43:53 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 07, 2024 2:43:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 07, 2024 2:43:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:14 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 07, 2024 2:43:53 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:14 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) completed! -Mar 07, 2024 2:43:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 07, 2024 2:43:53 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:14 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 12:50:14 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 08, 2024 12:50:14 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git completed! -Mar 07, 2024 2:43:53 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-1/tp.git... -Mar 07, 2024 2:43:53 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:14 AM reposense.report.ReportGenerator analyzeRepos INFO: [42/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 07, 2024 2:43:53 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:14 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-1/tp.git... +Mar 08, 2024 12:50:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 08, 2024 12:50:15 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git to complete... -Mar 07, 2024 2:43:54 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:15 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! -Mar 07, 2024 2:43:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git completed! -Mar 07, 2024 2:43:54 PM reposense.report.ReportGenerator analyzeRepos -INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:15 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! +Mar 08, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepos +INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 08, 2024 12:50:15 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-4/tp.git... -Mar 07, 2024 2:43:54 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:15 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git to complete... -Mar 07, 2024 2:43:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! -Mar 07, 2024 2:43:54 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! -Mar 07, 2024 2:43:54 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:15 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 12:50:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 08, 2024 12:50:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 08, 2024 12:50:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.report.ReportGenerator analyzeRepos -INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:15 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git completed! +Mar 08, 2024 12:50:15 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-2/tp.git... -Mar 07, 2024 2:43:54 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:15 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git to complete... -Mar 07, 2024 2:43:54 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 08, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! +Mar 08, 2024 12:50:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 08, 2024 12:50:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 07, 2024 2:43:54 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) completed! -Mar 07, 2024 2:43:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! -Mar 07, 2024 2:43:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:15 AM reposense.report.ReportGenerator analyzeRepos +INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 08, 2024 12:50:16 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 12:50:16 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 08, 2024 12:50:16 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! +Mar 08, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:16 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-4/tp.git... -Mar 07, 2024 2:43:55 PM reposense.report.ReportGenerator analyzeRepos -INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepos +INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 08, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git to complete... -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! -Mar 07, 2024 2:43:55 PM reposense.report.ReportGenerator analyzeRepos -INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git to complete... -Mar 07, 2024 2:43:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) completed! -Mar 07, 2024 2:43:55 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:16 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:16 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! -Mar 07, 2024 2:43:55 PM reposense.report.ReportGenerator analyzeRepos -INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! +Mar 08, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepos +INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 08, 2024 12:50:16 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... +Mar 08, 2024 12:50:16 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-3/tp.git... -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git to complete... -Mar 07, 2024 2:43:55 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:16 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git to complete... +Mar 08, 2024 12:50:16 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 08, 2024 12:50:16 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:16 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 07, 2024 2:43:55 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! -Mar 07, 2024 2:43:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:16 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) completed! -Mar 07, 2024 2:43:56 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:16 AM reposense.report.ReportGenerator analyzeRepos +INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 08, 2024 12:50:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 08, 2024 12:50:17 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! +Mar 08, 2024 12:50:17 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-1/tp.git... -Mar 07, 2024 2:43:56 PM reposense.report.ReportGenerator analyzeRepos -INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:17 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 12:50:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 08, 2024 12:50:17 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git to complete... -Mar 07, 2024 2:43:56 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 08, 2024 12:50:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 08, 2024 12:50:17 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) completed! +Mar 08, 2024 12:50:17 AM reposense.report.ReportGenerator analyzeRepos +INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 08, 2024 12:50:17 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:17 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! -Mar 07, 2024 2:43:56 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:17 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git completed! -Mar 07, 2024 2:43:56 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:17 AM reposense.report.ReportGenerator analyzeRepos INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:17 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... -Mar 07, 2024 2:43:56 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:17 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... -Mar 07, 2024 2:43:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! -Mar 07, 2024 2:43:56 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! -Mar 07, 2024 2:43:56 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:17 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! +Mar 08, 2024 12:50:17 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-1/tp.git... -Mar 07, 2024 2:43:56 PM reposense.report.ReportGenerator analyzeRepos -INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... -Mar 07, 2024 2:43:56 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:17 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 07, 2024 2:43:56 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! -Mar 07, 2024 2:43:57 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... +Mar 08, 2024 12:50:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 08, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! +Mar 08, 2024 12:50:18 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-2/tp.git... -Mar 07, 2024 2:43:57 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 08, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... -Mar 07, 2024 2:43:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! -Mar 07, 2024 2:43:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:18 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 08, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! +Mar 08, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepos +INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... +Mar 08, 2024 12:50:18 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 08, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! -Mar 07, 2024 2:43:57 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! +Mar 08, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepos +INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 08, 2024 12:50:18 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... -Mar 07, 2024 2:43:57 PM reposense.report.ReportGenerator analyzeRepos -INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:18 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... -Mar 07, 2024 2:43:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! -Mar 07, 2024 2:43:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.ReportGenerator analyzeRepos -INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:18 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 08, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) completed! +Mar 08, 2024 12:50:18 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:18 AM reposense.report.ReportGenerator analyzeRepos +INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 08, 2024 12:50:18 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 12:50:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 08, 2024 12:50:18 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) completed! -Mar 07, 2024 2:43:57 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! -Mar 07, 2024 2:43:57 PM reposense.report.ReportGenerator analyzeRepos -INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 07, 2024 2:43:57 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... -Mar 07, 2024 2:43:57 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... -Mar 07, 2024 2:43:58 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:58 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... +Mar 08, 2024 12:50:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 08, 2024 12:50:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) completed! -Mar 07, 2024 2:43:58 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! -Mar 07, 2024 2:43:58 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) completed! -Mar 07, 2024 2:43:58 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) completed! -Mar 07, 2024 2:43:58 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 08, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! -Mar 07, 2024 2:43:58 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepos +INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 08, 2024 12:50:19 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... +Mar 08, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... +Mar 08, 2024 12:50:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 08, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! +Mar 08, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git completed! +Mar 08, 2024 12:50:19 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 12:50:19 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 08, 2024 12:50:19 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... -Mar 07, 2024 2:43:58 PM reposense.report.ReportGenerator analyzeRepos -INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepos +INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... +Mar 08, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git to complete... -Mar 07, 2024 2:43:58 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git completed! -Mar 07, 2024 2:43:58 PM reposense.report.ReportGenerator analyzeRepos -INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:19 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! +Mar 08, 2024 12:50:19 AM reposense.report.ReportGenerator analyzeRepos +INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 08, 2024 12:50:19 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-1/tp.git... -Mar 07, 2024 2:43:58 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git to complete... -Mar 07, 2024 2:43:58 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:58 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 07, 2024 2:43:58 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:20 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:58 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! -Mar 07, 2024 2:43:59 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 08, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepos INFO: [56/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:20 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-4/tp.git... -Mar 07, 2024 2:43:59 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git to complete... -Mar 07, 2024 2:43:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:20 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 12:50:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 08, 2024 12:50:20 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:59 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git completed! -Mar 07, 2024 2:43:59 PM reposense.report.ReportGenerator analyzeRepos -INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-4/tp.git... -Mar 07, 2024 2:43:59 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) completed! -Mar 07, 2024 2:43:59 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... -Mar 07, 2024 2:43:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:43:59 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 08, 2024 12:50:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) completed! -Mar 07, 2024 2:43:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git completed! +Mar 08, 2024 12:50:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 08, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) completed! +Mar 08, 2024 12:50:20 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-4/tp.git... +Mar 08, 2024 12:50:20 AM reposense.report.ReportGenerator analyzeRepos +INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 08, 2024 12:50:20 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... +Mar 08, 2024 12:50:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 07, 2024 2:43:59 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) completed! -Mar 07, 2024 2:44:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:21 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 12:50:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 08, 2024 12:50:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) completed! -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 08, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git completed! -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepos INFO: [58/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:21 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-2/tp.git... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git to complete... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator analyzeRepos -INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-3/tp.git... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git to complete... -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:21 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 08, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) completed! +Mar 08, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git completed! -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator analyzeRepos -INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepos +INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 08, 2024 12:50:21 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-3/tp.git... +Mar 08, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git to complete... +Mar 08, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! +Mar 08, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepos +INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 08, 2024 12:50:21 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-2/tp.git... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:21 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git to complete... -Mar 07, 2024 2:44:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:21 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... +Mar 08, 2024 12:50:21 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 12:50:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 08, 2024 12:50:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:21 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) completed! -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 08, 2024 12:50:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 08, 2024 12:50:22 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! +Mar 08, 2024 12:50:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 08, 2024 12:50:22 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! +Mar 08, 2024 12:50:22 AM reposense.report.ReportGenerator analyzeRepos INFO: [61/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:22 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... +Mar 08, 2024 12:50:22 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git to complete... -Mar 07, 2024 2:44:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:22 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! -Mar 07, 2024 2:44:00 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:22 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:22 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 07, 2024 2:44:01 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 07, 2024 2:44:01 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 07, 2024 2:44:01 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! -Mar 07, 2024 2:44:01 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:22 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git completed! -Mar 07, 2024 2:44:01 PM reposense.report.ReportGenerator analyzeRepos -INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 07, 2024 2:44:01 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:22 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-2/tp.git... -Mar 07, 2024 2:44:01 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 07, 2024 2:44:01 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:22 AM reposense.report.ReportGenerator analyzeRepos +INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 08, 2024 12:50:22 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git to complete... -Mar 07, 2024 2:44:01 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:22 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:01 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:22 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 07, 2024 2:44:01 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 07, 2024 2:44:01 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) completed! -Mar 07, 2024 2:44:01 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 08, 2024 12:50:23 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git completed! -Mar 07, 2024 2:44:01 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:23 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-1/tp.git... -Mar 07, 2024 2:44:01 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:23 AM reposense.report.ReportGenerator analyzeRepos INFO: [63/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 07, 2024 2:44:01 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:23 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git to complete... -Mar 07, 2024 2:44:01 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:01 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 07, 2024 2:44:02 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:23 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 08, 2024 12:50:23 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) completed! +Mar 08, 2024 12:50:23 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git completed! -Mar 07, 2024 2:44:02 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:23 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-3/tp.git... -Mar 07, 2024 2:44:02 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:23 AM reposense.report.ReportGenerator analyzeRepos INFO: [64/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 07, 2024 2:44:02 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:23 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 12:50:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 08, 2024 12:50:23 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git to complete... -Mar 07, 2024 2:44:02 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:23 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:02 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 07, 2024 2:44:02 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:23 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 07, 2024 2:44:02 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! -Mar 07, 2024 2:44:02 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:24 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 08, 2024 12:50:24 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 07, 2024 2:44:02 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:24 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! -Mar 07, 2024 2:44:02 PM reposense.report.ReportGenerator analyzeRepos -INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 07, 2024 2:44:02 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:24 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 08, 2024 12:50:24 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) completed! +Mar 08, 2024 12:50:24 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! +Mar 08, 2024 12:50:24 AM reposense.report.ReportGenerator analyzeRepos +INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 08, 2024 12:50:24 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-1/tp.git... -Mar 07, 2024 2:44:02 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:24 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git to complete... -Mar 07, 2024 2:44:02 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:24 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! +Mar 08, 2024 12:50:24 AM reposense.report.ReportGenerator analyzeRepos +INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 08, 2024 12:50:24 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... +Mar 08, 2024 12:50:24 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... +Mar 08, 2024 12:50:24 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 12:50:24 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 08, 2024 12:50:24 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:02 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:24 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 07, 2024 2:44:02 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 07, 2024 2:44:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 07, 2024 2:44:03 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) completed! -Mar 07, 2024 2:44:03 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:24 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git completed! -Mar 07, 2024 2:44:03 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... -Mar 07, 2024 2:44:03 PM reposense.report.ReportGenerator analyzeRepos -INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 07, 2024 2:44:03 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... -Mar 07, 2024 2:44:03 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! -Mar 07, 2024 2:44:03 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:03 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 07, 2024 2:44:03 PM reposense.report.ReportGenerator analyzeRepos -INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 07, 2024 2:44:03 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:25 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-4/tp.git... -Mar 07, 2024 2:44:03 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:25 AM reposense.report.ReportGenerator analyzeRepos +INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 08, 2024 12:50:25 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git to complete... -Mar 07, 2024 2:44:03 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:25 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! -Mar 07, 2024 2:44:03 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:03 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 07, 2024 2:44:04 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:25 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-3/tp.git... -Mar 07, 2024 2:44:04 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:25 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git to complete... -Mar 07, 2024 2:44:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 07, 2024 2:44:04 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:25 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 12:50:25 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 08, 2024 12:50:25 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git completed! -Mar 07, 2024 2:44:04 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:25 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-2/tp.git... -Mar 07, 2024 2:44:04 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:25 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git to complete... -Mar 07, 2024 2:44:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 07, 2024 2:44:04 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! -Mar 07, 2024 2:44:04 PM reposense.report.ReportGenerator analyzeRepos -INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 07, 2024 2:44:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 07, 2024 2:44:04 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 07, 2024 2:44:04 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:26 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 08, 2024 12:50:26 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! -Mar 07, 2024 2:44:04 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:26 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-4/tp.git... -Mar 07, 2024 2:44:04 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:26 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git to complete... -Mar 07, 2024 2:44:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 07, 2024 2:44:04 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! -Mar 07, 2024 2:44:05 PM reposense.report.ReportGenerator analyzeRepos -INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 07, 2024 2:44:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:26 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 07, 2024 2:44:05 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 07, 2024 2:44:05 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git completed! -Mar 07, 2024 2:44:05 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:26 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 08, 2024 12:50:26 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! +Mar 08, 2024 12:50:26 AM reposense.report.ReportGenerator analyzeRepos +INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 08, 2024 12:50:26 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 07, 2024 2:44:05 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:26 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) completed! -Mar 07, 2024 2:44:05 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:26 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 08, 2024 12:50:26 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git completed! +Mar 08, 2024 12:50:26 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-3/tp.git... -Mar 07, 2024 2:44:05 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:26 AM reposense.report.ReportGenerator analyzeRepos +INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 08, 2024 12:50:26 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git to complete... -Mar 07, 2024 2:44:05 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:26 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 12:50:26 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 08, 2024 12:50:26 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 12:50:26 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 08, 2024 12:50:27 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 08, 2024 12:50:27 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! +Mar 08, 2024 12:50:27 AM reposense.report.ReportGenerator analyzeRepos INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 07, 2024 2:44:05 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git to complete... +Mar 08, 2024 12:50:27 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 07, 2024 2:44:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:27 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 07, 2024 2:44:05 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git completed! +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... +Mar 08, 2024 12:50:27 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 08, 2024 12:50:27 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 07, 2024 2:44:05 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:27 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! -Mar 07, 2024 2:44:05 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! +Mar 08, 2024 12:50:27 AM reposense.report.ReportGenerator analyzeRepos INFO: [71/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 07, 2024 2:44:05 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git completed! -Mar 07, 2024 2:44:05 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... -Mar 07, 2024 2:44:05 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git to complete... -Mar 07, 2024 2:44:05 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... +Mar 08, 2024 12:50:27 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! -Mar 07, 2024 2:44:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... -Mar 07, 2024 2:44:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... -Mar 07, 2024 2:44:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:27 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:27 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) completed! -Mar 07, 2024 2:44:06 PM reposense.report.ReportGenerator analyzeRepos -INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! -Mar 07, 2024 2:44:06 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... -Mar 07, 2024 2:44:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:27 AM reposense.report.ReportGenerator analyzeRepos +INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! +Mar 08, 2024 12:50:27 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... +Mar 08, 2024 12:50:28 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... +Mar 08, 2024 12:50:28 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 12:50:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 08, 2024 12:50:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 08, 2024 12:50:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:28 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) completed! -Mar 07, 2024 2:44:06 PM reposense.report.ReportGenerator analyzeRepos -INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... -Mar 07, 2024 2:44:06 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:28 AM reposense.report.ReportGenerator analyzeRepos +INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... +Mar 08, 2024 12:50:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 08, 2024 12:50:28 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! -Mar 07, 2024 2:44:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... -Mar 07, 2024 2:44:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... -Mar 07, 2024 2:44:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:28 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! +Mar 08, 2024 12:50:28 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... +Mar 08, 2024 12:50:28 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... +Mar 08, 2024 12:50:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 07, 2024 2:44:06 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:28 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! -Mar 07, 2024 2:44:06 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:28 AM reposense.report.ReportGenerator analyzeRepos INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 07, 2024 2:44:07 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:28 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! +Mar 08, 2024 12:50:28 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-4/tp.git... +Mar 08, 2024 12:50:28 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git to complete... +Mar 08, 2024 12:50:28 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 07, 2024 2:44:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 07, 2024 2:44:07 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! -Mar 07, 2024 2:44:07 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... -Mar 07, 2024 2:44:07 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! -Mar 07, 2024 2:44:07 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... -Mar 07, 2024 2:44:07 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-4/tp.git... -Mar 07, 2024 2:44:07 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! +Mar 08, 2024 12:50:29 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... +Mar 08, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... +Mar 08, 2024 12:50:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 07, 2024 2:44:07 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) completed! -Mar 07, 2024 2:44:07 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepos INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 07, 2024 2:44:07 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git to complete... -Mar 07, 2024 2:44:07 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:29 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 07, 2024 2:44:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 07, 2024 2:44:08 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! -Mar 07, 2024 2:44:08 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... -Mar 07, 2024 2:44:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 07, 2024 2:44:08 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) completed! -Mar 07, 2024 2:44:08 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... -Mar 07, 2024 2:44:08 PM reposense.report.ReportGenerator analyzeRepos -INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 07, 2024 2:44:08 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:29 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git completed! -Mar 07, 2024 2:44:08 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 07, 2024 2:44:08 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:29 AM reposense.report.ReportGenerator analyzeRepos +INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 08, 2024 12:50:29 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-2/tp.git... -Mar 07, 2024 2:44:08 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 07, 2024 2:44:08 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:30 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git to complete... -Mar 07, 2024 2:44:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 07, 2024 2:44:08 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! -Mar 07, 2024 2:44:08 PM reposense.report.ReportGenerator analyzeRepos -INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 07, 2024 2:44:08 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git completed! -Mar 07, 2024 2:44:08 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:30 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:30 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 07, 2024 2:44:09 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:30 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git completed! +Mar 08, 2024 12:50:30 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-3/tp.git... -Mar 07, 2024 2:44:09 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:30 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git to complete... -Mar 07, 2024 2:44:09 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! -Mar 07, 2024 2:44:09 PM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 12:50:30 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 08, 2024 12:50:30 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! +Mar 08, 2024 12:50:30 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-1/tp.git... -Mar 07, 2024 2:44:09 PM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 12:50:30 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git to complete... -Mar 07, 2024 2:44:09 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 07, 2024 2:44:09 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:30 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! +Mar 08, 2024 12:50:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 08, 2024 12:50:30 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! +Mar 08, 2024 12:50:30 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-3/tp.git... +Mar 08, 2024 12:50:30 AM reposense.report.ReportGenerator analyzeRepos +INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 08, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git to complete... +Mar 08, 2024 12:50:31 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 12:50:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 08, 2024 12:50:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 07, 2024 2:44:09 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 07, 2024 2:44:09 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) completed! -Mar 07, 2024 2:44:09 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 08, 2024 12:50:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 08, 2024 12:50:31 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! +Mar 08, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git completed! +Mar 08, 2024 12:50:31 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-2/tp.git... +Mar 08, 2024 12:50:31 AM reposense.report.ReportGenerator analyzeRepos INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 07, 2024 2:44:09 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:31 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git to complete... +Mar 08, 2024 12:50:31 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:09 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 07, 2024 2:44:09 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 07, 2024 2:44:09 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! -Mar 07, 2024 2:44:09 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! -Mar 07, 2024 2:44:09 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-3/tp.git... -Mar 07, 2024 2:44:09 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 08, 2024 12:50:31 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! +Mar 08, 2024 12:50:31 AM reposense.report.ReportGenerator analyzeRepos INFO: [79/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git to complete... -Mar 07, 2024 2:44:10 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:32 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! +Mar 08, 2024 12:50:32 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git completed! +Mar 08, 2024 12:50:32 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git completed! -Mar 07, 2024 2:44:10 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:32 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-2/tp.git... +Mar 08, 2024 12:50:32 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-1/tp.git... +Mar 08, 2024 12:50:32 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... +Mar 08, 2024 12:50:32 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... +Mar 08, 2024 12:50:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 08, 2024 12:50:32 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! +Mar 08, 2024 12:50:32 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-1/tp.git... +Mar 08, 2024 12:50:32 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git to complete... +Mar 08, 2024 12:50:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 08, 2024 12:50:32 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) completed! +Mar 08, 2024 12:50:32 AM reposense.report.ReportGenerator analyzeRepos INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-2/tp.git... -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git to complete... -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! -Mar 07, 2024 2:44:10 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:32 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:32 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! -Mar 07, 2024 2:44:10 PM reposense.report.ReportGenerator analyzeRepos -INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-2/tp.git... -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... -Mar 07, 2024 2:44:10 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:32 AM reposense.report.ReportGenerator analyzeRepos +INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 08, 2024 12:50:32 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 12:50:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 08, 2024 12:50:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 08, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! +Mar 08, 2024 12:50:33 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-3/tp.git... +Mar 08, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git to complete... +Mar 08, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! +Mar 08, 2024 12:50:33 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-1/tp.git... +Mar 08, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! +Mar 08, 2024 12:50:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 08, 2024 12:50:33 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! +Mar 08, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git to complete... +Mar 08, 2024 12:50:33 AM reposense.report.ReportGenerator analyzeRepos +INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 08, 2024 12:50:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! +Mar 08, 2024 12:50:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... +Mar 08, 2024 12:50:33 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:33 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git completed! -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-1/tp.git... -Mar 07, 2024 2:44:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... -Mar 07, 2024 2:44:11 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! -Mar 07, 2024 2:44:11 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-1/tp.git... -Mar 07, 2024 2:44:11 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git to complete... -Mar 07, 2024 2:44:11 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 07, 2024 2:44:11 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 07, 2024 2:44:11 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! -Mar 07, 2024 2:44:11 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-3/tp.git... -Mar 07, 2024 2:44:11 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 07, 2024 2:44:11 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! -Mar 07, 2024 2:44:11 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:33 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) completed! -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator analyzeRepos -INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git to complete... -Mar 07, 2024 2:44:12 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-1/tp.git... -Mar 07, 2024 2:44:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! -Mar 07, 2024 2:44:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:33 AM reposense.report.ReportGenerator analyzeRepos INFO: [83/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git to complete... -Mar 07, 2024 2:44:12 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! -Mar 07, 2024 2:44:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:33 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:33 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos +INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:34 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 12:50:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator analyzeRepos -INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 07, 2024 2:44:12 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos +INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:34 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 12:50:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepos -INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepos -INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepos -INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos +INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) completed! +Mar 08, 2024 12:50:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos +INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 12:50:34 AM reposense.report.ReportGenerator analyzeRepos +INFO: [91/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... +Mar 08, 2024 12:50:35 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 12:50:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 08, 2024 12:50:35 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 12:50:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:35 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 12:50:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepos -INFO: [91/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepos INFO: [92/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) does not contain a standalone config file. -Mar 07, 2024 2:44:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:35 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 12:50:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... +Mar 08, 2024 12:50:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 12:50:35 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) completed! -Mar 07, 2024 2:44:13 PM reposense.report.ReportGenerator generateReposReport +Mar 08, 2024 12:50:35 AM reposense.report.ReportGenerator generateReposReport INFO: The report is generated at /home/runner/work/tp-dashboard/tp-dashboard/reposense-report -Mar 07, 2024 2:44:14 PM reposense.RepoSense main -INFO: Elapsed processing time: 37.96 second(s) +Mar 08, 2024 12:50:35 AM reposense.RepoSense main +INFO: Elapsed processing time: 38.94 second(s) diff --git a/summary.json b/summary.json index f6dc1542..cbe7af82 100644 --- a/summary.json +++ b/summary.json @@ -1 +1 @@ -{"repoSenseVersion":"bbb2f694a7","reportGeneratedTime":"Thu Mar 7 22:43:36 2024 UTC+08:00","reportGenerationTime":" 37.65 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-07","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 08:49:57 2024 UTC+08:00","reportGenerationTime":" 38.62 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"}}}